2016-11-14 4 views
0

My Gridview ist wie folgtBearbeiten von Gridview Für dynamisch generierte Feld

Es hat Emptydatatemplate und Befehlsfeld

<asp:GridView ID="AGridView" runat="server" AutoGenerateColumns="true" style="table-layout:fixed;" Width="2000px" RowStyle-HorizontalAlign="Left"> 
     <EmptyDataTemplate> 
      &nbsp; 
     </EmptyDataTemplate> 
     <asp:CommandField ShowEditButton="True" ItemStyle-Width="80px" EditText="Edit"> 
     <ItemStyle Font-Bold="true" Font-Size="Small" /> 
      <HeaderStyle CssClass="AAddOn" /> 
     </asp:CommandField> 
    </asp:GridView> 

Grid Sieht aus wie

Name Age Country 
A  10 NNN  Edit 
B  23 NNN  Edit 

Nun, wenn ich, dass ich auf bearbeiten klicken müssen nur Alter zu bearbeitende Spalte

Wenn ich AGridView.EditIndex = e.NewEditInde gebe x ganze Zeile wird

Private Sub AGridView_RowEditing(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewEditEventArgs) Handles AGridView.RowEditing 
      Try 
       AGridView.EditIndex = e.NewEditIndex 

       AGridView.DataSource = SessionItems.ADataset.Tables("AHello") 
       AGridView.DataBind() 

      Catch ex As Exception 
       SetErrorMsg(ex.Message.ToString, "Error") 
      End Try 
     End Sub 

Antwort

1

In Code-Behind bearbeitet, das einfach ist. Unabhängig von den Spalten, die Sie nicht bearbeiten möchten, fügen Sie einfach diese in DataKeyNames Eigenschaft des Rasters hinzu. Versuche dies.

<asp:GridView ID="AGridView" runat="server" AutoGenerateColumns="true" style="table-layout:fixed;" Width="2000px" RowStyle-HorizontalAlign="Left" DataKeyNames = "Name,Country" > 
     <EmptyDataTemplate> 
      &nbsp; 
     </EmptyDataTemplate> 
     <asp:CommandField ShowEditButton="True" ItemStyle-Width="80px" EditText="Edit"> 
     <ItemStyle Font-Bold="true" Font-Size="Small" /> 
      <HeaderStyle CssClass="AAddOn" /> 
     </asp:CommandField> 
    </asp:GridView> 


    Private Sub AGridView_RowEditing(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewEditEventArgs) Handles AGridView.RowEditing 
       Try 

        Dim colsToNotEdit As List<string> 

//C# code 

     for (int i = 0; i < AGridView.HeaderRow.Cells.Count; i++) 
    { 
     if(AGridView.HeaderRow.Cells[i].Text !="age") 
      colsToNotEdit.Add(grdToDisplay.HeaderRow.Cells[i].Text); 
    } 
      AGridView.DataKeyNames = colsToNotEdit.ToArray() 
    AGridView.EditIndex = e.NewEditIndex 

        AGridView.DataSource = SessionItems.ADataset.Tables("AHello") 
        AGridView.DataBind() 

       Catch ex As Exception 
        SetErrorMsg(ex.Message.ToString, "Error") 
       End Try 
      End Sub 
+0

Ich habe wenig Problem hier..Meine Spalten werden dynamisch generiert.Iam Binding meine Gridview mit Datentabelle, die Spalten dynamisch generiert. Ist es möglich in Gridview Was auch immer die Spalten bearbeitet werden müssen, kann hinzugefügt werden, wie Sie in Datakeynames anstelle der Spalte erwähnt haben, die nicht bearbeitet werden müssen. – havin

+1

Ich habe Ihr Problem. Die mögliche Lösung, die ich in der RowEditing-Ereignisschleife für Gridview-Spalten sehen kann, um ein String-Array mit nicht bearbeitbaren Feldern zu erstellen. Weisen Sie dann DataKeyNames dem Array zu. –

+0

Kannst du mir mit Code helfen .. Wie Datakeyname mit Gridview rowediting generierte Werte zu binden, wie Sie oben mit scenerio – havin

1

Eine andere Option wäre, die AutoGenerateColumns-Funktion nicht zu verwenden und Ihre Spaltenvorlagen anzugeben.

Auf diese Weise können Sie ItemTemplate, EditTemplate oder FooterTemplate für jede Spalte angeben.

Also für eine Spalte, die Sie nicht bearbeiten möchten, dh. Name Verwendung <asp:BoundField> und für die Alten Gebrauch:

<asp:TemplateField> 
    <ItemTemplate><asp:Label>Bind Me</asp:Label></ItemTemplate> 
    <EditItemTemplate><asp:TextBox>Bind Me</asp:TextBox></EditItemTemplate> 
</asp:TemplateField> 

Edit: Wenn dynamische Spalte Name

Wenn Sie eine Datentabelle, die Ihre Daten enthält, läßt dtRowData sagen.

Sie sollten ein Stück Code, in dem Sie die Datentabelle an das Netz zuweisen:

GridView1.DataSource = dtRowData; 
GridView1.DataBind(); 

Sie eine Schleife in vor dem databind Anruf hinzufügen können, wie folgt:

string DataKeyNames = ""; 
foreach (DataColumn dc in dtRowData.Columns) 
{ 
    if(dc.Name != "Age") 
     DataKeyNames += dc.Name + ","; 
} 

Und dann vor Binding Set GridView1.DataKeyNames = DataKeyNames

Sie müssen wahrscheinlich eine Teilzeichenfolge auf DataKeyNames tun, um die nachfolgende,

zu entfernen
+0

Meine Spalte ist dynamisch generiert .. Ich binde meine Gridview mit Datentabelle, die Spalte dynamisch generiert daher ich Artikel Vorlage nicht verwenden kann .. – havin

+0

Erstellen Sie dynamisch die Spalten im Code? Wenn nicht, können Sie die Spalten immer noch angeben, indem Sie einfach die Eigenschaft datafield verwenden, um die Datenbankspalte anzugeben, mit der eine Verknüpfung hergestellt werden soll. – ThatChris

+0

Ja meine Datatable holt Spalten dynamisch..Zum Beispiel Spalten können A, B, C sein und das nächste Mal variiert es so kann es A, B, C, D, E..So kann ich nicht Vorlagenfeld verwenden, wie Sie oder erwähnt Verwenden Sie datakeyname als Vicky Mentioned in unter Post .. Gibt es eine Alternative – havin

Verwandte Themen