8

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

编辑:简而言之,我有一个从数据源构建的 GridView,所以基本上,每一行代表一个对象,当我在其中一行中选中一个复选框时,我希望能够获取与那行,实现这一目标的最简单方法是什么?

Page_Load 上的数据绑定:

  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 请求,但它似乎有点繁重,必须有更好的解决方案。

4

2 回答 2

4

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

于 2012-07-31T19:34:41.260 回答
3

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

所以我建议你OnCheckedChanged="chkStatus_OnCheckedChanged"asp:checkbox调用时设置事件chkSelect,然后你只能更新选定的行,而不必遍历整个网格。

这是一个示例,您如何获取所选复选框的行项目

public void chkStatus_OnCheckedChanged(object sender, EventArgs e)
{
    CheckBox chkStatus = (CheckBox)sender;

    //now grab the row that you want to update
    GridViewRow row = (GridViewRow)chkStatus.NamingContainer;


    string cid = row.Cells[1].Text;
    bool status = chkStatus.Checked;

    //now you can do you sql update here
}
于 2012-07-27T20:14:04.560 回答