2016-07-19 13 views
1

Ich habe eine ASP.Net 4.5.1 Webanwendung, die eine Seite mit einem GridView und einem DetailsView hat. Die beiden Steuerelemente sind verknüpft, sodass beim Klicken auf die Schaltfläche "Auswählen" in der GridView die DetailsView die Daten für diese Zeile anzeigt. Der Datensatz DetailsView verfügt über die Schaltflächen Bearbeiten und Löschen. Das alles funktioniert gut. Ich möchte jedoch nicht eine neue Schaltfläche am unteren Rand der DetailsView zusammen mit den Schaltflächen Bearbeiten und Löschen hinzufügen. Ich sehe keinen Grund, warum mein Benutzer einen vorhandenen Datensatz auswählen sollte, bevor er einen neuen Datensatz in den Datensatz eingibt.Programmgesteuert hinzufügen neue Schaltfläche zu ASP.Net DetailsView

Also - Ich habe eine ASP-Taste oben auf der Seite namens btnNew erstellt. Mit dieser Schaltfläche öffnen Sie die DetailsView und ändern ihren Modus in Einfügen. Ich habe zwei Buttons in der DetailsView FooterTemplate, btnInsert und btnCancel. Sie sind standardmäßig nicht sichtbar, aber ich mache sie sichtbar, wenn auf btnNew geklickt wird.

Hier ist das Problem: wenn ich das erste Mal auf btnNew klicke, öffnet sich das DetailsView im Insert-Modus und btnInsert und btnCancel werden korrekt angezeigt. Wenn ich jedoch auf btnCancel klicke (die DetailsView und zwei Buttons verschwinden, alle gut) und dann erneut auf btnNew klicken, erscheint die DetailsView, aber btnInsert und btnCancel nicht. Wenn ich ein zweites Mal auf btnNew klicke, erscheinen sie. Wenn ich die Zeile in btnNew_Click (siehe unten) verschiebe, ändert sich der DetailsView-Modus an der Unterseite der Methode Insert, und wenn ich beim ersten Mal auf btnNew klicke, sehe ich btnInsert und btnCancel nicht, aber wenn ich darauf klicke ein zweites Mal tauchen sie auf. Wenn ich den Code im Debug-Modus durchlaufe, werden btnInsert und btnCancel gefunden, und ihre Visible-Eigenschaft wird auf True festgelegt, aber sie werden nicht angezeigt.

Ich habe meinen Code auf eine Seite mit nur einem DetailsView (kein GridView) ohne Datenbindung, ohne Masterseite, ohne Ajax-Steuerelemente, aber das Problemverhalten besteht weiter vereinfacht. Unten ist dieser vereinfachte Code. Zuerst mein Markup:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="SimpleDefault.aspx.cs" Inherits="ElectronicCaseFilingHistory.SimpleDefault" %> 

<!DOCTYPE html> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head id="Head1" runat="server"> 
    <title></title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div> 
    <asp:Button runat="server" ID="btnNew" Text="Add New" OnClick="btnNew_Click" BackColor="#F8F8F8" BorderColor="#9BE8E8" ForeColor="#3C3C3C" /> 
    <asp:DetailsView runat="server" ID="dvFilingDetail" AutoGenerateRows="false" > 
     <Fields> 
      <asp:TemplateField HeaderText="Attorney" HeaderStyle-Font-Bold="true"> 
       <ItemTemplate> 
        <asp:Label runat="server" ID="lbAttorneyName" /> 
       </ItemTemplate> 
       <EditItemTemplate> 
        <asp:TextBox runat="server" ID="tbAttorneyName" /> 
       </EditItemTemplate> 
      </asp:TemplateField> 
      <asp:TemplateField HeaderText="Court" HeaderStyle-Font-Bold="true"> 
       <ItemTemplate> 
        <asp:Label runat="server" ID="lbCourt" /> 
       </ItemTemplate> 
       <EditItemTemplate> 
        <asp:TextBox runat="server" ID="tbCourt" /> 
       </EditItemTemplate> 
      </asp:TemplateField> 
     </Fields> 
     <FooterTemplate> 
      <asp:Button runat="server" ID="btnInsert" Visible="false" Text="Insert" /> 
      <asp:Button runat="server" ID="btnCancel" Visible="false" OnClick="btnCancel_Click" Text="Cancel" /> 
     </FooterTemplate> 
    </asp:DetailsView> 
    </div></form></body></html> 

nun der Code hinter:

using System; 
using System.Collections.Generic; 
using System.Data; 
using System.Data.SqlClient; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

namespace ElectronicCaseFilingHistory 
{ 

public partial class SimpleDefault : System.Web.UI.Page 
{ 

    protected void Page_Load(object sender, EventArgs e) 
    { 

    } 

    protected void btnNew_Click(object sender, EventArgs e) 
    { 
     dvFilingDetail.ChangeMode(DetailsViewMode.Insert); 
     Button insert = (Button)dvFilingDetail.FindControl("btnInsert"); 
     Button cancel = (Button)dvFilingDetail.FindControl("btnCancel"); 
     if (insert != null) 
      insert.Visible = true; 
     if (cancel != null) 
      cancel.Visible = true; 
    } 

    protected void btnCancel_Click(object sender, EventArgs e) 
    { 
     dvFilingDetail.ChangeMode(DetailsViewMode.ReadOnly); 
     dvFilingDetail.DataBind(); 
    } 
} 
} 

Ich habe versucht, eine InsertItemTemplate zusätzlich zu einem EditItemTemplate Zugabe, aber das hat keine Wirkung. Ich fügte CommandName = New zu btnNew hinzu und fügte ein ItemCommand-Ereignis zur DetailsView hinzu, um dies zu versuchen, aber die ItemCommand-Methode wurde nie getroffen.

Was mache ich falsch?

Antwort

1

Nachdem Sie DetailsViewMode zu Insert geändert haben, müssen Sie auch DataBind(); anrufen.

protected void btnNew_Click(object sender, EventArgs e) 
{ 
    dvFilingDetail.ChangeMode(DetailsViewMode.Insert); 
    dvFilingDetail.DataBind(); 

    Button insert = (Button)dvFilingDetail.FindControl("btnInsert"); 
    Button cancel = (Button)dvFilingDetail.FindControl("btnCancel"); 
    if (insert != null) 
    { 
     insert.Visible = true; 
    } 
    if (cancel != null) 
    { 
     cancel.Visible = true; 
    } 
} 
+0

Das funktioniert. Kann ich dich für eine Art von Preis nominieren? Kannst du mir jetzt sagen, WARUM es funktioniert? Ich würde es verstehen, wenn, ohne ein DataBind, die Knöpfe NIEMALS auftauchten, aber erst mal ja, zweites Mal nein, drittes Mal ja ??? Und trotzdem, DANKE !! – Melanie

+1

Ich kann dir eigentlich nicht genau sagen wieso, aber ich gehe davon aus, dass das Umladen der Seite (zweites Klicken auf die Schaltfläche) die gleiche Wirkung wie 'DataBind()' hat und wir daher beim zweiten Versuch die Schaltflächen hinzufügen dürfen. Oder 'DataBind()' wird nach einem Seiten-Reload unter der Haube aufgerufen. Bitte schön! – soumer

Verwandte Themen