【问题标题】:Editing GridView For dynamically generated Field为动态生成的字段编辑 GridView
【发布时间】:2016-11-14 12:08:11
【问题描述】:

我的GridView如下

它有 EmptyDatatemplate 和 Command Field

   <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.NewEditIndex 整行被编辑

在代码隐藏中

   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

【问题讨论】:

    标签: asp.net vb.net gridview datatable


    【解决方案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
    

    【讨论】:

    • 我这里有一点问题..我的列是动态生成的。我将我的 gridview 与动态生成列的数据表绑定。是否可以在gridview中添加任何需要可编辑的列,就像您在datakeynames中提到的那样,而不是不需要编辑的列..
    • 我遇到了你的问题。我可以看到的可能解决方案是,在 gridview 列的 RowEditing 事件循环中创建具有不可编辑字段的字符串数组。然后将 DataKeyNames 分配给数组。
    • 你能帮我写代码吗..如何将 Datakeyname 与 gridview rowediting 生成的值绑定,如你在上面提到的场景
    • 编辑了答案。答案在 C# 中有循环,将其更改为 VB.NET。该代码可能几乎没有语法错误。需要离开。
    • 您好,grdToDisplay 是什么,colsToNotEdit 在您的代码中是什么意思。
    【解决方案2】:

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

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

    因此,对于您不想编辑的列,即。名称使用&lt;asp:BoundField&gt; 和年龄使用:

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

    编辑:使用动态列名时

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

    您应该有一段代码将数据表分配给网格:

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

    您可以在 databind 调用之前添加一个循环,如下所示:

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

    然后在绑定集之前GridView1.DataKeyNames = DataKeyNames

    您可能需要在 DataKeyNames 上做一个子字符串来删除尾随,

    【讨论】:

    • 我的列是动态生成的..我将我的 gridview 与动态生成列的数据表绑定,因此我不能使用项目模板..
    • 您是否在代码中动态创建列?如果不是,您仍然可以指定列,只需使用 datafield 属性来指定必须链接到的数据库列。
    • 是的,我的数据表正在动态检索列。例如,列可能是 A、B、C,下次它会发生变化,所以它可以是 A、B、C、D、E。所以我不能使用您提到的模板字段或使用下面帖子中提到的 Vicky 的 datakeyname ..有没有其他选择
    • 您仍然可以使用上面提到的数据名称,您只需在根据列名检索数据表后动态构建字符串,然后在数据绑定之前设置 datakeynames 值
    • 编辑我的答案给你一个想法
    猜你喜欢
    • 1970-01-01
    • 2014-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-23
    相关资源
    最近更新 更多