我一直在使用一整天都在困扰我的Gridview。我不经常使用Gridviews,因此其中一些让我感到困惑,谷歌没有像我希望的那样有多大的帮助。
我正在尝试将通过LINQ创建的对象绑定到gridview,然后进行一些更新。
XAML:
<asp:GridView runat="server" ID="GV1"
onrowediting="gridViewUsers_RowEditing"
onrowcancelingedit="gridViewUsers_RowCancelingEdit"
onrowdeleting="gridViewUsers_RowDeleting"
onrowupdating="gridViewUsers_RowUpdating"
>
<Columns>
<asp:CommandField ShowEditButton="True" />
</Columns>
</asp:GridView>
代码:
private void BindGrid()
{
List<Room> stuff = new List<Room>();
Hotel = dc1.Rooms.ToList();
GV1.DataSource = Hotel;
GV1.DataBind();
}
protected void gridViewUsers_RowEditing(object sender, GridViewEditEventArgs e)
{
GV1.EditIndex = e.NewEditIndex;
BindGrid();
}
我想从所选行中获取Room对象,并通过LINQ将其更新回数据库。但我似乎无法抓住那个对象。我的下一次尝试是从行中抓取每个条目。所以我找到了类似下面例子的代码。但一切都是空的。
protected void gridViewUsers_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
string tenant = ((TextBox)(GV1.Rows[e.RowIndex].FindControl("Tenant"))).Text;
string age = ((TextBox)(GV1.Rows[e.RowIndex].FindControl("Age"))).Text;
string roomno = ((TextBox)(GV1.Rows[e.RowIndex].FindControl("Room_No"))).Text;
BindGrid();
}
答案 0 :(得分:0)
尝试设置AutoGenerateColumns = false并手动提供列。 类似的东西:
<asp:GridView runat="server" ID="GV1"
onrowediting="gridViewUsers_RowEditing"
onrowcancelingedit="gridViewUsers_RowCancelingEdit"
onrowdeleting="gridViewUsers_RowDeleting"
onrowupdating="gridViewUsers_RowUpdating"
AutoGenerateColumns = "false"
>
<Columns>
<asp:CommandField ShowEditButton="True" />
<asp:BoundField HeaderText="Tenant" DataField="Tenant" />
<asp:BoundField HeaderText="Age" DataField="Age" />
<asp:BoundField HeaderText="Room_No" DataField="Room_No" />
</Columns>
</asp:GridView>
编辑: 请将此代码添加到您的解决方案
public static int GetCellIndexByFieldHandle(this GridView grid, string fieldHandle)
{
int iCellIndex = -1;
for (int iColIndex = 0; iColIndex < grid.Columns.Count; iColIndex++)
{
if (grid.Columns[iColIndex] is DataControlField)
{
DataControlField col = (DataControlField)grid.Columns[iColIndex];
if ((col is BoundField && string.Compare(((BoundField)col).DataField, fieldHandle, true) == 0)
|| string.Compare(col.SortExpression, fieldHandle, true) == 0
|| col.HeaderText.Contains(fieldHandle))
{
iCellIndex = iColIndex;
break;
}
}
}
return iCellIndex;
}
/// <summary>
/// Gets the ordinal index of a TableCell in a rendered GridViewRow, using a text fieldHandle (e.g. the corresponding column's DataFieldName/SortExpression/HeaderText)
/// </summary>
public static int GetCellIndexByFieldHandle(this GridViewRow row, string fieldHandle)
{
return GetCellIndexByFieldHandle((GridView)row.Parent.Parent, fieldHandle);
}
然后尝试
string tenant = ((TextBox)GV1.Rows[e.RowIndex].Cells[GV1.Rows[e.RowIndex].GetCellIndexByFieldHandle("Tenant")].Controls[0]).Text;
答案 1 :(得分:0)
尝试使用此代码访问您的textbox
值。
protected void gridViewUsers_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
GridViewRow row = gridViewUsers.Rows[e.RowIndex];
Textbox txtbxtenant = (TextBox)row.FindControl("Tenant");
string tenanat = Convert.toString(tentant.text);
Textbox txtbxAge =(Textbox)row.FindControl("Age");
string age = Convert.toString(Age.text);
// string roomno = ((TextBox)
//(GV1.Rows[e.RowIndex].FindControl("Room_No"))).Text;
// BindGrid();
}