2016-11-14 78 views
0

我的GridView的是如下编辑的GridView动态生成的场

它EmptyDatatemplate和命令字段

<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> 

的GridView看起来

Name Age Country 
A  10 NNN  Edit 
B  23 NNN  Edit 

现在,如果我点击编辑我只需要年龄栏编辑

如果我给AGridView.EditIndex = e.NewEditInde X整行编辑

在代码隐藏

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 

回答

1

这很简单。无论您不希望编辑哪些列,只需将其添加到DataKeyNames网格属性中即可。尝试这个。

<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

我在这里没有什么问题..我的列是动态生成的.Iam绑定我的gridview与数据表,动态生成列。是否有可能在gridview无论列需要编辑可以添加像你在datakeynames中提到,而不是列不需要编辑.. – havin

+1

我得到你的问题。我可以看到,在GridEditor的RowEditing事件循环中创建一个带有不可编辑字段的字符串数组。然后将DataKeyNames分配给该数组。 –

+0

你可以帮我编码..如何绑定DataKeysname与GridView rowediting生成的值,如上所述与上述scenerio – havin

1

另一种选择是不使用AutoGenerateColumns功能并指定列模板。

这样您可以为每列指定ItemTemplate,EditTemplate或FooterTemplate。

所以对于你不想编辑的列,即。名称使用<asp:BoundField>和年龄使用:

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

编辑:当使用动态列名

如果您拥有一个包含数据的数据表,可以说dtRowData

你应该有一段代码在您指定的DataTable到网格:

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

然后前:

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

你可以在数据绑定调用之前添加如下循环绑定集GridView1.DataKeyNames = DataKeyNames

您可能需要在DataKeyNames上执行子字符串以删除尾部,

+0

我的专栏是动态生成的..我绑定我的gridview与datatable,它动态地生成列,因此我不能使用项目模板.. – havin

+0

您是否在代码中动态创建列?如果不是,您仍然可以指定列,只需使用datafield属性来指定它必须链接到的数据库列。 – ThatChris

+0

是的,我的数据表是动态检索列。例如列可能是A,B,C,下一次它变化,所以它可以是A,B,C,D,E ..所以我不能像你提到的那样使用模板字段或使用datakeyname作为Vicky提到下面的帖子..是否有其他替代 – havin