0

一日中困惑している Gridview に完全に問題があります。私は Gridviews をあまり使用しないので、これのいくつかは私を混乱させ、Google は私が望んでいたほどの助けにはなりませんでした。

LINQ を介して作成されたオブジェクトをグリッドビューにバインドしてから、更新しようとしています。

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();
    }
4

2 に答える 2

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;
于 2013-11-15T07:37:05.857 に答える
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();

    }
于 2013-11-15T10:57:01.727 に答える