C# 使用复选框在GridView中选择多行:程序不提取数据

C# 使用复选框在GridView中选择多行:程序不提取数据,c#,gridview,checkbox,C#,Gridview,Checkbox,在尝试从GridView控件的多行中选择和提取数据时,我在代码中遇到了一个奇怪的bug/错误 背景: 简言之,我有一个GridView项目,其中填充了签入和可用于签出系统的不同设备项目行。我想让用户能够选择多个项目,并检查他们一次,而不是做X倍 我在每一行上使用一个复选框项来执行此操作,如下所示: 底部有一个按钮,用于从我们的数据库中检查设备 代码: 我用来生成ASPX页面的代码是: <asp:GridView ID="grdEquipment" runat="server" AutoGe

在尝试从GridView控件的多行中选择和提取数据时,我在代码中遇到了一个奇怪的bug/错误

背景: 简言之,我有一个GridView项目,其中填充了签入和可用于签出系统的不同设备项目行。我想让用户能够选择多个项目,并检查他们一次,而不是做X倍

我在每一行上使用一个复选框项来执行此操作,如下所示:

底部有一个按钮,用于从我们的数据库中检查设备

代码: 我用来生成ASPX页面的代码是:

<asp:GridView ID="grdEquipment" runat="server" AutoGenerateColumns="false" ShowHeaderWhenEmpty="true" CssClass="table table-bordered">
    <Columns>
        <asp:TemplateField HeaderText="Select">
            <ItemTemplate>
                <asp:CheckBox ID="chkMultiSelect_Out" runat="server" />
            </ItemTemplate>
        </asp:TemplateField>
        <asp:BoundField HeaderText="Equipment Name" DataField="Name" />
        <asp:BoundField HeaderText="Category" DataField="Category.Name" />
    </Columns>
    <EmptyDataTemplate>
        There is no equipment to display.
    </EmptyDataTemplate>
</asp:GridView>
<div class="well">
    <asp:Button ID="btnCheckOut" runat="server" CssClass="btn btn-small btn-inverse" Text="Check Out" OnClick="btnCheckOut_Click" />
</div>
这项工作和编译没有问题

运行按钮检查所有内容的代码如下:

protected void btnCheckOut_Click(object sender, EventArgs e)
    {
        int checkoutNumber = 0;
        //string id = (sender as Button).Attributes["data-id"].ToString();

        SortedBindingList<Tracker.Business.Equipment> eqList = Tracker.Business.EquipmentList.FetchAll();

        foreach (GridViewRow row in this.grdEquipment.Rows)
        {
                CheckBox chkMultiSelect_Out = (CheckBox)row.FindControl("chkMultiSelect_Out") ;
                if (chkMultiSelect_Out.Checked)
                {
                    checkoutNumber++;
                    Tracker.Business.Equipment equip = Tracker.Business.Equipment.GetByIdentification(Int32.Parse(row.ID.ToString()));
                    eqList.Add(equip);
                }

        }

        //If checkoutNumber is 0, do nothing.
        //If checkoutNumber is 1, launch popup for only 1 item
        //If checkoutNumber is more than 1, launch popup for multiple items.
        if (checkoutNumber == 0)
        {
            Response.Redirect("~/Equipment/CheckInOut/Default.aspx");
        }
        else if (checkoutNumber == 1)
        {

        }
        else if (checkoutNumber > 1)
        {

        }
    }
显然,这段代码还没有完成。我一边调试一边让我的生活更轻松。 重要的代码是foreach循环,我在其中检查控制项的每一行,并查看它是否被选中

问题是: 当我运行代码并选中一些复选框进行测试时,它会查看所有行,并且所有行都将check=false作为属性。更糟糕的是,我后来发现它甚至无法从行中获取数据,如下面的屏幕截图所示:

文本应该是擎天柱或开关1,但它不是!当我运行代码时,两者都被检查,但是代码只看到错误的检查项

代码在每一行的foreach循环中运行,即3行,它在循环中运行3次。所以它可以看到每一行,但它并没有提取数据


我应该从哪里开始寻找呢?

我解决了我的问题。如前所述,每次单击时我都会对页面进行回发,因此我将代码更改为仅在页面加载时对gridview表进行数据绑定,而不是回发。现在工作

由于文本不是在aspx标记上以声明方式设置的,您在哪里设置文本?您是否也在回发上对GridView进行数据绑定?如果您手动对其进行数据绑定,并且只有在以下情况下才应执行此操作!我支持蒂姆的评论。在OnClick事件触发之前,您的网格很有可能被重新数据绑定,从而导致您的所有更改被覆盖。