0

GridView コントロールの複数の行からデータを選択してプルしようとすると、コードで奇妙なバグ/エラーが発生しました。

背景: 要するに、「チェックイン」され、システムからチェックアウトできるさまざまな機器アイテムの行が取り込まれた GridView アイテムがあります。X回ではなく、ユーザーが複数のアイテムを選択して一度にチェックアウトできるようにしたい.

これを行うために、各行でチェックボックス項目を使用しています: http://i.imgur.com/fPYV2.png

下部に、データベースから機器をチェックアウトするためのボタンがあります。

コード: 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 ループです。

問題: コードを実行し、いくつかのチェック ボックスをオンにしてテストすると、すべての行が調べられ、すべての行に属性として "Checked = false" が含まれています。さらに悪いことに、次のスクリーンショットに示すように、行からデータを取得することさえできないことが後でわかりました: http://i.imgur.com/clRuk.png

テキストは「Optimus Prime」または「Switch #1」のはずですが、そうではありません! コードを実行すると両方がチェックされますが、コードには誤ったチェック項目しか表示されません。

コードは各行、つまり 3 行に対して foreach ループを実行し、ループを 3 回実行します。したがって、各行が表示されますが、データを取得していません...

どこから探し始めるべきですか?

4

1 に答える 1

0

問題を修正しました。Tim Schmelterが言ったように、クリックするたびにページをポストバックしていたので、コードを変更して、ポストバックではなく、ページのロード時にのみ gridview テーブルをデータバインドしました。今すぐ動作します!

于 2013-01-11T20:42:55.127 に答える