havin
havin

Reputation: 203

Editing GridView For dynamically generated Field

My GridView is as follows

It has EmptyDatatemplate and 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 Looks like

Name   Age  Country
A      10    NNN       Edit  
B      23    NNN       Edit

Now if i click on edit i need only Age Column to be edited

If i give AGridView.EditIndex = e.NewEditIndex entire row is edited

In codebehind

   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

Upvotes: 0

Views: 1434

Answers (2)

Vicky_Burnwal
Vicky_Burnwal

Reputation: 981

That's simple. Whatever the columns you don't want editable, just add those in DataKeyNames property of grid. Try this.

<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

Upvotes: 1

ThatChris
ThatChris

Reputation: 752

Another option would be to not use the AutoGenerateColumns functionality and specify your column templates.

This way you can specify the ItemTemplate, EditTemplate or FooterTemplate for each column.

So for a column that you dont want to edit, ie. Name use <asp:BoundField> and for age use:

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

Edit: When using Dynamic Column Names

If you have a datatable that contains your data, lets say dtRowData.

You should have a piece of code where you assign the datatable to the grid:

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

You can add a loop in before the databind call as follows:

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

And then before Binding Set GridView1.DataKeyNames = DataKeyNames

You will probably need to do a substring on DataKeyNames to remove the trailing ,

Upvotes: 1

Related Questions