从GridViewRow ASP.NET获取项目

时间:2012-07-27 19:56:07

标签: c# asp.net gridview

我有一个GridView,我将数据源从SQL数据库绑定到它,网格有一个带有复选框的列,所以我可以“选择”其中的一些项目(实际上是行)。我想要的是在每个选定的行中对Item进行一些更新,但在一些搜索后我找不到如何访问一行中的Item,虽然DataItem可以工作,但它给了我一个Null。

编辑:为了简化,我有一个从DataSource构建的GridView,所以基本上,每行代表一个Object,当我在其中一行中选中了复选框时,我希望能够获取与该行相关的对象,实现该目标的最简单方法是什么?

Page_Load上的DataBinding:

  if (!Page.IsPostBack)
    {
        gvUnusedAccessories.DataSource = currentContext.Items.OfType<Accessory>().Where(ac => ac.Item_Parent_Id == ((PhoneLine)currentItem).Parent.Item_Id);
        gvUnusedAccessories.AutoGenerateColumns = false;
        gvUnusedAccessories.DataBind();
    }

当我按下更新按钮时的事件,它实际上浏览行,如果行有一个复选框,它将进行更新:

protected void btnAddToMobile_Click(object sender, EventArgs e)
{
    foreach (GridViewRow row in gvUnusedAccessories.Rows)
    {
        if(((CheckBox)row.FindControl("chkSelect")).Checked)
        {
            ((Accessory)row.DataItem).PhoneLine_Id = currentItem.Item_Id;
        }
    }
}

这是我在.aspx中的GridView:

 <asp:GridView ID="gvUnusedAccessories" runat="server">
    <Columns>
        <asp:CommandField ShowSelectButton="True" />
        <asp:TemplateField HeaderText="Select">
            <ItemTemplate >
                <asp:CheckBox ID="chkSelect" runat="server" AutoPostBack="True"/>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:BoundField DataField="Item_Id" HeaderText="ID" ReadOnly="True"/>
        <asp:BoundField DataField="Item_Name" HeaderText="Name" ReadOnly="True"/>  
        <asp:BoundField DataField="AccessoryModel" HeaderText="Modèle" ReadOnly="True"/>
        <asp:BoundField DataField="AccessoryBrand" HeaderText="Marque" ReadOnly="True"/>
    </Columns>
</asp:GridView>

有关如何访问行内包含的对象的任何提示? 我知道我实际上可以获得ID,然后向我的数据库发出SQL请求,但它似乎有点沉重,必须有更好的解决方案。

2 个答案:

答案 0 :(得分:3)

除非您在数据绑定完成后将数据源存储在ViewState或会话中,否则会丢失数据源。除非您这样做,否则DataItem将始终为null。因此,我经常发现自己将数据源存储在视图状态。当然,这意味着您的页面大小会变得更大。您所说的另一个选项是使用某种主键重新查询数据源。根据您的需要,我不能说哪个选项更好。我倾向于倾向于视图状态而不是第二个DB调用,因为这可能是一个昂贵的调用

答案 1 :(得分:2)

鉴于您AutoPostBack上的asp:checkbox设置为true,您必须在设置复选框时更新该行

因此,我建议您在名为OnCheckedChanged="chkStatus_OnCheckedChanged"的{​​{1}}上设置事件asp:checkbox,然后您只能更新所选行,而不必遍历enitre网格。< / p>

以下是如何获取所选复选框的行项目的示例

chkSelect