私は同じ問題を抱えていましたが、この修正 (ハンドラーに条件を追加するジェイソンのもの) はうまくいきませんでした。Edit 行はデータバインドされていないため、条件が true と評価されることはありません。RowDataBound は、GridView.EditIndex と同じ RowIndex で呼び出されることはありません。ただし、ドロップダウンをプログラムでバインドする代わりに、ページの ObjectDataSource にバインドするという点で、私のセットアップは少し異なります。ただし、可能な値は行内の他の情報に依存するため、ドロップダウンは行ごとに個別にバインドする必要があります。したがって、ObjectDataSource には SessionParameter があり、バインドに必要な場合は適切なセッション変数を設定するようにします。
<asp:ObjectDataSource ID="objInfo" runat="server" SelectMethod="GetData" TypeName="MyTypeName">
<SelectParameters>
<asp:SessionParameter Name="MyID" SessionField="MID" Type="Int32" />
</SelectParameters>
関連する行のドロップダウン:
<asp:TemplateField HeaderText="My Info" SortExpression="MyInfo">
<EditItemTemplate>
<asp:DropDownList ID="ddlEditMyInfo" runat="server" DataSourceID="objInfo" DataTextField="MyInfo" DataValueField="MyInfoID" SelectedValue='<%#Bind("ID") %>' />
</EditItemTemplate>
<ItemTemplate>
<span><%#Eval("MyInfo") %></span>
</ItemTemplate>
</asp:TemplateField>
私がやったことは、GridView で CommandField を使用して、編集、削除、更新、およびキャンセル ボタンを生成することではありませんでした。私は TemplateField を使用して自分でそれを行い、CommandNames を適切に設定することで、GridView で組み込みの編集/削除/更新/キャンセル アクションをトリガーすることができました。[編集] ボタンでは、通常の行の PK ではなく、ドロップダウンをバインドするために必要な情報を CommandArgument にしました。幸いなことに、これは GridView が適切な行を編集することを妨げませんでした。
<asp:TemplateField>
<ItemTemplate>
<asp:ImageButton ID="ibtnDelete" runat="server" ImageUrl="~/images/delete.gif" AlternateText="Delete" CommandArgument='<%#Eval("UniqueID") %>' CommandName="Delete" />
<asp:ImageButton ID="ibtnEdit" runat="server" ImageUrl="~/images/edit.gif" AlternateText="Edit" CommandArgument='<%#Eval("MyID") %>' CommandName="Edit" />
</ItemTemplate>
<EditItemTemplate>
<asp:ImageButton ID="ibtnUpdate" runat="server" ImageUrl="~/images/update.gif" AlternateText="Update" CommandArgument='<%#Eval("UniqueID") %>' CommandName="Update" />
<asp:ImageButton ID="ibtnCancel" runat="server" ImageUrl="~/images/cancel.gif" AlternateText="Cancel" CommandName="Cancel" />
</EditItemTemplate>
</asp:TemplateField>
そして、RowCommand ハンドラーで:
void grdOverrides_RowCommand(object sender, GridViewCommandEventArgs e)
{
if (e.CommandName == "Edit")
Session["MID"] = Int32.Parse(e.CommandArgument.ToString());
}
もちろん、RowCommand は、行が編集モードになる前、つまりドロップダウン データバインドの前に発生します。したがって、すべてが機能します。ちょっとハックですが、編集行がまだデータバインドされていない理由を突き止めるのに十分な時間を費やしました。