在GridView中编辑行时,我需要一个DropDownList,它的可用值列表取决于行中的其他列(现在我们只说记录的“类型”);也就是说,根据正在编辑的行,将列出不同的选项。
我通过在GridView中添加一个本来不需要的DataKeyName来让它工作,但是这让我在其他地方感到很痛苦,而且无论如何感觉太迂回了,所以我正在寻找一个更好的方法。
在.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执行,该命令将激发OnSelecting代码,我将在其中提供正在编辑的行的参数值(EditIndex),以便在DropDownList中获得适当的值填充。
有没有“更好”的方法?对我来说,最重要的方面是避免添加DataKeyName,因为这会给我用来从GridView中删除行的存储过程带来参数太多的问题。
1条答案
按热度按时间5n0oy7gb1#
您应该使用Gridview
RowDataBound
,在其中可以获取valueID,稍后可以填充Dropdownlist
,还可以添加一个label/hidden
字段,您要将其值填充到DropdownList中用c#编写代码的方法。
你可以试试这样的