1

チェックボックス付きのTemplateFieldを持つGridViewがあります。私の目標は、autopostbackを使用してonclickイベントをキャプチャし、データベースフラグを設定することです。私の唯一の問題は、イベントが2回発生することです。初めてチェックボックス(送信者パラメーター内)がクリックされた値を保持するので、クリックに基づいて設定しました。2回目は、送信者パラメーターに常にチェックされているチェックボックス=falseがあります。この問題を解決するための他のアプローチについての提案を喜んで受け入れますが、私の目標は、チェックボックスをオンにしたユーザーに基づいてデータベースフラグを設定することです。.NETFramework2.0をターゲットにしています。

関連するコードは次のとおりです。

<div style="margin-left : 1em;margin-right:1em;">
    <asp:GridView ID="RouteGridView" runat="server" AllowPaging="True" 
            AutoGenerateColumns="False" CellPadding="4" DataKeyNames="ROUTE_NUMBER" 
            ForeColor="#333333" GridLines="None" style="width:100%;" 
        onselectedindexchanged="RouteGridView_SelectedIndexChanged" 
        AllowSorting="True" onpageindexchanging="RouteGridView_PageIndexChanging" 
        onsorting="RouteGridView_Sorting" >
            <Columns>
<%-- Column one --%>
<asp:TemplateField HeaderText="Route" SortExpression="ROUTE_NUMBER">
    <ItemTemplate>
        <asp:LinkButton ID="HyperLink1" runat="server" CommandName="Select" CommandArgument='<%#Eval("ROUTE_NUMBER")%>'  
                            Text='<%# Eval("ROUTE_NUMBER") %>' ></asp:LinkButton>
    </ItemTemplate>
    <ItemStyle HorizontalAlign="Center" />
</asp:TemplateField>

<%-- Column 2 this is where the problem CheckBox is--%>
<asp:TemplateField HeaderText="Read?" 
    SortExpression="READ_FLAG">
    <ItemTemplate>
        <asp:CheckBox ID="CheckBox1" runat="server" 
            OnCheckedChanged="ChangeReadFlag"  
            AutoPostBack="true"
            Checked='<%# (string)DataBinder.Eval(Container.DataItem, "READ_FLAG") == "1" %>' Enabled='<%# isSelectedRow(Container)  %>' />
    </ItemTemplate>
    <ItemStyle HorizontalAlign="Center" />
</asp:TemplateField>

<%-- more columns --%
<%-- more columns --%>
</Columns>
</asp:GridView>

コードビハインドのイベントハンドラーは次のとおりです。

protected void ChangeReadFlag(object sender, EventArgs e)
{
    if (RouteGridView.SelectedIndex != -1)
    {
        CheckBox cb = ((CheckBox)sender);
        DataKey key = RouteGridView.SelectedDataKey;

        //... do stuff here ...
    }
}
4

5 に答える 5

1

このような動作にはいくつかの理由が考えられます。私の場合、イベントは2回登録されていました。1回はチェックボックス定義の一部として自動的に登録されていました。
<asp:CheckBox ID="CheckBox1" runat="server" **OnCheckedChanged="ChangeReadFlag"** AutoPostBack="true" Checked='<%# (string)DataBinder.Eval(Container.DataItem, "READ_FLAG") == "1" %>' Enabled='<%# isSelectedRow(Container) %>' />

2回目-コードのどこか、通常はOnInitメソッドでの明示的な登録:
CheckBox1.CheckedChanged += new EventHandler(ChangeReadFlag);

これを修正するには、コードビハインドまたはコントロールから2番目の登録を削除する必要があります。

于 2009-01-27T09:41:46.077 に答える
1

ページ読み込みイベントで、チェックボックスのチェック済みステータスをまったく false に設定していますか?

于 2008-12-19T00:26:02.317 に答える
0

問題が発生する理由の1つ(他にもある可能性があります)は、イベントが2回登録されていることです。

「InitializeComponent」内のコードビハインドでコードを確認してください。これにより、イベントが2回登録されるため、2回発生します。

問題を解決するには、1か所で削除する必要があります。

RAM。

于 2008-12-19T12:29:02.477 に答える
0

GridView のイベントをキャプチャします。ポストバックの原因となっているコマンド (送信者) を特定すると、DB の更新を実行できます。

于 2008-12-18T22:55:51.797 に答える
0

別の潜在的な問題は、データバインディングが発生している場所です。コードインフロントに DataSource が表示されないため、コードビハインドでデータバインディングしていると思います。

ポストバックでデータバインドを実行していて、最初の onChange イベントが発生した後に、データバインド イベントがチェックボックスのステータスをリセットし、イベントが再び発生する可能性が非常に高いです。

于 2009-01-27T10:24:03.357 に答える