GridView で行を編集する場合、使用可能な値のリストが行内の他の列に依存する DropDownList が必要です (ここでは、レコードの「タイプ」とだけ言っておきましょう)。つまり、編集中の行に応じて異なるオプションが表示されます。
そうでなければ不要な DataKeyName を GridView に追加することで、ファッションの後に機能するようになりましたが、これは他の場所で悲しみを引き起こし、とにかく遠回りすぎると感じるので、より良い方法を探しています。これが私が現在行っている方法です:
.aspx ファイル:
<asp:GridView ID="gvDct" ... DataKeyNames="dctId,dctType" ... >
...
<asp:TemplateField>
...
<EditItemTemplate>
<asp:DropDownList ID="ddlDctParent" runat="server"
DataSourceId="sdsDctParent"
DataValueField="dctId" DataTextField="dctFullPath"
SelectedValue='<%# Bind("dctParentId") %>'
... >
</asp:DropDownList>
<asp:SqlDataSource ID="sdsDctParent" runat="server"
ConnectionString="<%$ ConnectionStrings:ConnectionString %>"
OnSelecting="sdsDctParent_Selecting"
SelectCommand="SELECT dctId, dctFullPath FROM lkpDocCatAndType
WHERE dctType=@dctType">
<SelectParameters>
<asp:Parameter Name="dctType" />
</SelectParameters>
</asp:SqlDataSource>
</EditItemTemplate>
</asp:TemplateField>
...
</asp:GridView>
SelectParameter を ControlID="gvDct" および PropertyName="SelectedDataKey.Values[dctType]" の ControlParameter にしたかったのですが、不明な理由で機能しませんでした (パラメーター値が null でした)。 .vb コード ビハインド ファイルを使用して、DropDownList のデータ ソースの行固有のパラメーターを設定します。
Protected Sub sdsDctParent_Selecting(ByVal sender As Object, _
ByVal e As System.Web.UI.WebControls.SqlDataSourceSelectingEventArgs)
e.Command.Parameters(0).Value = gvDct.DataKeys(gvDct.EditIndex).Item(1)
End Sub
そのため、GridView で行の編集を開始すると、DropDownList がバインドされ、SqlDataSource SelectCommand が実行され、編集中の行 (EditIndex) からパラメーター値を提供する OnSelecting コードが起動され、適切なDropDownList の値の母集団。
「より良い」方法はありますか?私にとって最も重要な側面は、DataKeyName を追加しないようにすることです。これは、GridView から行を削除するために使用しているストアド プロシージャでパラメーターが多すぎる問題を引き起こしているためです。