Reputation: 203
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>
</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
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>
</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
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