在Gridview中绑定和更新LINQ对象

时间:2013-11-15 07:26:08

标签: c# asp.net linq gridview

我一直在使用一整天都在困扰我的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();
    }

2 个答案:

答案 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();

    }
相关问题