10

だから私は私のウェブページにこのGridViewを持っています。これはデータバインドされているため、RowDataBoundイベント中、このコードは完全に機能します。

    protected void myGridView_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            TimecardApproval shift = (TimecardApproval)e.Row.DataItem;
        }
    }

「shift」変数には、必要なすべてのデータが含まれており、うまく機能します。しかし、データを保存するための次のコードがあります。

    protected void btnSubmitApprovals_Click(object sender, ImageClickEventArgs e)
    {
        foreach (GridViewRow item in gvTimeCards.Rows)
        {
            TimecardApproval shift = (TimecardApproval)item.DataItem;
            // code to update the row
        }
    }

DataItemはnullです!なんで?フィールドがそこにあるので、それがnullであるのは奇妙に思えます。私は何か他のものをループする必要がありますか?

4

3 に答える 3

13

DataItemをTimeCardApprovalにキャストすることで、インテリセンスが必要になる可能性があることを理解しています。代わりにこれを行うことができます。DataKeyNamesを使用して、各行の主キーを格納TimecardApprovalIDします。コード内で主キーにアクセスし、それを使用して元のアイテムを取得します。

foreach (GridViewRow item in gvTimeCards.Rows)
{
   //get the ID of the TimeApproval for each row
   string id = gvDocs.DataKeys[item.RowIndex].Value.ToString();
   //string id = ((HiddenField) item.FindControl("IDHiddenField")).Value;
   //string id = item.Cells[0].Text;

   //use the ID or get TimeCardApproval object from DB    
   TimecardApproval shift = MyDB.GetTimeCardApproval(id);

}

キーの設定

<asp:GridView ID="gvTimeCards" DataKeyNames="TimecardApprovalID">
</asp:GridView>
于 2012-11-08T23:35:48.433 に答える
3

たぶん、これは
グリッド列に役立ちます:

<asp:TemplateField HeaderText="Item ID">
<ItemTemplate>
    <asp:Label runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "Id") %>'/>
    <asp:HiddenField runat="server" ID="hfDataItem" Value='<%# JsonConvert.SerializeObject(Container.DataItem) %>'/>
</ItemTemplate></asp:TemplateField>

背後にあるコード:

    protected void btApply_OnClick(object sender, EventArgs e)
    {
        var rows = (from GridViewRow row in gvResult.Rows
            where row.RowType == DataControlRowType.DataRow
            let dataItem = (HiddenField) row.FindControl("hfDataItem")
            select JsonConvert.DeserializeObject<ResultGridRowItem>(dataItem.Value));

    }
于 2015-06-30T10:59:34.187 に答える
1

gridview databindイベントは、ボタンがクリックされる前に発生します。奇妙に聞こえますが、それはasp.netページのライフサイクルの狂気です。gridviewRowUpdatingまたはRowUpdatedeventでコードを使用してみてください。

于 2012-11-09T03:45:48.783 に答える