Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从GridViewRow ASP.NET获取项目_C#_Asp.net_Gridview - Fatal编程技术网

C# 从GridViewRow ASP.NET获取项目

C# 从GridViewRow ASP.NET获取项目,c#,asp.net,gridview,C#,Asp.net,Gridview,我有一个GridView,我从SQL数据库将一个数据源绑定到它,网格中有一个带有复选框的列,因此我可以“选择”其中的一些项目(实际上是行)。我想在这里对每个选定行中的项目进行一些更新,但是经过一些搜索后,我找不到如何访问行中的项目,我认为DataItem可以工作,但它给了我一个空值 编辑:简而言之,我有一个从数据源构建的GridView,因此基本上,每行代表一个对象,当我在其中一行中选中复选框时,我希望能够获取与该行相关的对象,最简单的方法是什么 加载页面上的数据绑定: 下面是我在.aspx中的

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

编辑:简而言之,我有一个从数据源构建的GridView,因此基本上,每行代表一个对象,当我在其中一行中选中复选框时,我希望能够获取与该行相关的对象,最简单的方法是什么

加载页面上的数据绑定:

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

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

因此,我建议您将event
OnCheckedChanged=“chkStatus\u OnCheckedChanged”
设置为
asp:checkbox
调用
chkSelect
,然后您只能更新所选行,而不必在enitre网格上迭代

下面是一个示例,说明如何获取选中复选框的行项目

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
}

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

,除非在数据绑定完成后将数据源存储在ViewState或会话中,否则会丢失数据源。除非您这样做,否则DataItem将始终为null。因此,我经常发现自己在视图状态下存储数据源。当然,这意味着你的页面会越来越大。如您所述的另一个选项是使用某种键重新查询数据源。根据你的需要,我说不出哪个选项更好。我倾向于查看状态,而不是第二次数据库调用,因为这可能是一个昂贵的调用。谢谢!这就是我正在寻找的答案,你应该考虑把它作为一个真正的答案,所以我可以把它解决。我可能也会使用ViewState,因为某些原因,循环DB调用的事实听起来真的很讨厌。
 <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>
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
}