我有一个相当标准的ASP.NET GridView,它显示了2列具有父子关系的列。虽然数据库中存在A列和B列之间的关系,但GridView不会实现它。
我想做以下事情: 当用户选择编辑该行时,将显示2个下拉菜单。 DropDownB应根据DropDownA的值自动填充可用选项。 DropDownA更改时,需要更新DropDownB以反映当前选项。
目前网格可用的列:
- ColumnAID
- ColumnADescription
- ColumnBID
- ColumnBDescription
我当然可以在网格之外完成相同的功能,甚至可以让选定的行事件显示模式弹出窗口,允许我相应地编辑字段,但是希望将其保存到网格中。
答案 0 :(得分:2)
以下示例显示2个下拉假期组和假日类型。
根据Holiday Group的选择,将加载假日类型下拉列表。
这里的问题是自动回发设置为“true”并定义第一个下拉列表OnSelectedIndexChanged="CboHolidayGroup_SelectedIndexChanged"
的selectindex更改事件
将“(”和“)”替换为“<”和“>”分别
以下代码可用于网格视图中的级联下拉列表:
设计页面
(asp:TemplateField HeaderText="(*) Holiday Group")
(ItemStyle CssClass="TEXTBOX_MEDIUM" /)
(EditItemTemplate)
(asp:DropDownList ID="CboHolidayGroup" CssClass="DROPDOWN_SMALL" runat="server"
DataTextField="holidaygroup" DataValueField="holiday_group_code_id" AutoPostBack="true"
OnSelectedIndexChanged="CboHolidayGroup_SelectedIndexChanged")
(/asp:DropDownList)
(asp:RangeValidator ID="RvHolidayGroup" runat="server" ControlToValidate="CboHolidayGroup"
Display="None" ErrorMessage="Please Select Holiday Group" MaximumValue="1000"
MinimumValue="1" SetFocusOnError="true" Type="Integer" ValidationGroup="VgrpUpdate")
(/asp:RangeValidator)
(/EditItemTemplate)
(ItemTemplate)
(asp:Label ID="LblHolidayGroup" CssClass="DROPDOWN_SMALL" runat="server" Text='<%# Eval("holidaygroup") %>')(/asp:Label)
(/ItemTemplate)
(FooterTemplate)
(asp:DropDownList ID="CboNewHolidayGroup" CssClass="DROPDOWN_SMALL" runat="server"
DataTextField="holidaygroup" DataValueField="holiday_group_code_id" Enabled="false"
AutoPostBack="true" OnSelectedIndexChanged="CboHolidayGroup_SelectedIndexChanged")
(/asp:DropDownList)
(asp:RangeValidator ID="RvNewHolidayGroup" runat="server" ControlToValidate="CboNewHolidayGroup"
Display="None" ErrorMessage="Please Select Holiday Group" MaximumValue="1000"
MinimumValue="1" SetFocusOnError="true" Type="Integer" ValidationGroup="VgrpInsert")
(/asp:RangeValidator)
(/FooterTemplate)
(/asp:TemplateField)
(asp:TemplateField HeaderText="(*) Holiday Type")
(ItemStyle CssClass="DROPDOWN_XLARGE" /)
(EditItemTemplate)
(asp:DropDownList ID="CboHolidayType" CssClass="DROPDOWN_XLARGE" runat="server"
DataTextField="holidaytype" DataValueField="holiday_type_code_id")
(/asp:DropDownList)
(asp:RangeValidator ID="RvHolidayType" runat="server" ControlToValidate="CboHolidayType"
Display="None" ErrorMessage="Please Select Holiday Type" MaximumValue="1000"
MinimumValue="1" SetFocusOnError="true" Type="Integer" ValidationGroup="VgrpUpdate")
(/asp:RangeValidator)
(/EditItemTemplate)
(ItemTemplate)
(asp:Label ID="LblHolidayType" CssClass="DROPDOWN_XLARGE" runat="server" Text='<%# Eval("holidaytype") %>')(/asp:Label)
(/ItemTemplate)
(FooterTemplate)
(asp:DropDownList ID="CboNewHolidayType" CssClass="DROPDOWN_XLARGE" runat="server"
DataTextField="holidaytype" DataValueField="holiday_type_code_id" Enabled="false")
(/asp:DropDownList)
(asp:RangeValidator ID="RvNewHolidayType" runat="server" ControlToValidate="CboNewHolidayType"
Display="None" ErrorMessage="Please Select Holiday Type" MaximumValue="1000"
MinimumValue="1" SetFocusOnError="true" Type="Integer" ValidationGroup="VgrpInsert")
(/asp:RangeValidator)
(/FooterTemplate)
(/asp:TemplateField)
代码背后和设计
<asp:TemplateField HeaderText="(*) Holiday Group">
<ItemStyle CssClass="TEXTBOX_MEDIUM" />
<EditItemTemplate>
<asp:DropDownList ID="CboHolidayGroup" CssClass="DROPDOWN_SMALL" runat="server"
DataTextField="holidaygroup" DataValueField="holiday_group_code_id" AutoPostBack="true"
OnSelectedIndexChanged="CboHolidayGroup_SelectedIndexChanged">
</asp:DropDownList>
<asp:RangeValidator ID="RvHolidayGroup" runat="server" ControlToValidate="CboHolidayGroup"
Display="None" ErrorMessage="Please Select Holiday Group" MaximumValue="1000"
MinimumValue="1" SetFocusOnError="true" Type="Integer" ValidationGroup="VgrpUpdate">
</asp:RangeValidator>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="LblHolidayGroup" CssClass="DROPDOWN_SMALL" runat="server" Text='<%# Eval("holidaygroup") %>'></asp:Label>
</ItemTemplate>
<FooterTemplate>
<asp:DropDownList ID="CboNewHolidayGroup" CssClass="DROPDOWN_SMALL" runat="server"
DataTextField="holidaygroup" DataValueField="holiday_group_code_id" Enabled="false"
AutoPostBack="true" OnSelectedIndexChanged="CboHolidayGroup_SelectedIndexChanged">
</asp:DropDownList>
<asp:RangeValidator ID="RvNewHolidayGroup" runat="server" ControlToValidate="CboNewHolidayGroup"
Display="None" ErrorMessage="Please Select Holiday Group" MaximumValue="1000"
MinimumValue="1" SetFocusOnError="true" Type="Integer" ValidationGroup="VgrpInsert">
</asp:RangeValidator>
</FooterTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="(*) Holiday Type">
<ItemStyle CssClass="DROPDOWN_XLARGE" />
<EditItemTemplate>
<asp:DropDownList ID="CboHolidayType" CssClass="DROPDOWN_XLARGE" runat="server" DataTextField="holidaytype"
DataValueField="holiday_type_code_id">
</asp:DropDownList>
<asp:RangeValidator ID="RvHolidayType" runat="server" ControlToValidate="CboHolidayType"
Display="None" ErrorMessage="Please Select Holiday Type" MaximumValue="1000"
MinimumValue="1" SetFocusOnError="true" Type="Integer" ValidationGroup="VgrpUpdate">
</asp:RangeValidator>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="LblHolidayType" CssClass="DROPDOWN_XLARGE" runat="server" Text='<%# Eval("holidaytype") %>'></asp:Label>
</ItemTemplate>
<FooterTemplate>
<asp:DropDownList ID="CboNewHolidayType" CssClass="DROPDOWN_XLARGE" runat="server"
DataTextField="holidaytype" DataValueField="holiday_type_code_id" Enabled="false">
</asp:DropDownList>
<asp:RangeValidator ID="RvNewHolidayType" runat="server" ControlToValidate="CboNewHolidayType"
Display="None" ErrorMessage="Please Select Holiday Type" MaximumValue="1000"
MinimumValue="1" SetFocusOnError="true" Type="Integer" ValidationGroup="VgrpInsert">
</asp:RangeValidator>
</FooterTemplate>
</asp:TemplateField>
#Region "CboHolidayGroup_SelectedIndexChanged"
Protected Sub CboHolidayGroup_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs)
Dim sGroup As String = String.Empty
Dim intGroup As Integer = 0
Dim dtNewHolidayType As DataTable
Dim dtHolidayType As DataTable
Dim objAims As iSymbol = Factory.Factory.CreateSymbolObject()
If DirectCast(sender, DropDownList).SelectedIndex > 0 Then
If Not IsNothing(DirectCast(sender, DropDownList).Parent.FindControl("CboHolidayGroup")) Then
sGroup = DirectCast(sender, DropDownList).SelectedItem.Text
intGroup = DirectCast(sender, DropDownList).SelectedValue
If sGroup = "Bank" Then
If Not IsNothing(DirectCast(sender, DropDownList).Parent.FindControl("ChkBankHoliday")) Then
DirectCast(DirectCast(sender, DropDownList).Parent.FindControl("ChkBankHoliday"), CheckBox).Checked = True
End If
If Not IsNothing(DirectCast(sender, DropDownList).Parent.FindControl("ChkNewBankHoliday")) Then
DirectCast(DirectCast(sender, DropDownList).Parent.FindControl("ChkNewBankHoliday"), CheckBox).Checked = True
End If
Else
If Not IsNothing(DirectCast(sender, DropDownList).Parent.FindControl("ChkBankHoliday")) Then
DirectCast(DirectCast(sender, DropDownList).Parent.FindControl("ChkBankHoliday"), CheckBox).Checked = False
End If
If Not IsNothing(DirectCast(sender, DropDownList).Parent.FindControl("ChkNewBankHoliday")) Then
DirectCast(DirectCast(sender, DropDownList).Parent.FindControl("ChkNewBankHoliday"), CheckBox).Checked = False
End If
End If
If Not IsNothing(DirectCast(sender, DropDownList).Parent.FindControl("CboHolidayType")) Then
Dim CboHolidayType As DropDownList = DirectCast(DirectCast(sender, DropDownList).Parent.FindControl("CboHolidayType"), DropDownList)
dtHolidayType = objSymbol.GetSelectedHolTypes(intGroup)
If (dtHolidayType.Rows.Count > 0) Then
CboHolidayType.DataSource = dtHolidayType
CboHolidayType.DataTextField = "holidaytype"
CboHolidayType.DataValueField = "holiday_type_code_id"
CboHolidayType.DataBind()
AddFirstItem(CboHolidayType, _CON_COMBO_FIRST_SELECT)
End If
End If
End If
If Not IsNothing(DirectCast(sender, DropDownList).Parent.FindControl("CboNewHolidayGroup")) Then
sGroup = DirectCast(sender, DropDownList).SelectedItem.Text
intGroup = DirectCast(sender, DropDownList).SelectedValue
If sGroup = "Bank" Then
If Not IsNothing(DirectCast(sender, DropDownList).Parent.FindControl("ChkNewBankHoliday")) Then
DirectCast(DirectCast(sender, DropDownList).Parent.FindControl("ChkNewBankHoliday"), CheckBox).Checked = True
End If
Else
If Not IsNothing(DirectCast(sender, DropDownList).Parent.FindControl("ChkNewBankHoliday")) Then
DirectCast(DirectCast(sender, DropDownList).Parent.FindControl("ChkNewBankHoliday"), CheckBox).Checked = False
End If
End If
If Not IsNothing(DirectCast(sender, DropDownList).Parent.FindControl("CboNewHolidayType")) Then
Dim CboNewHolidayType As DropDownList = DirectCast(DirectCast(sender, DropDownList).Parent.FindControl("CboNewHolidayType"), DropDownList)
dtHolidayType = objSymbol.GetSelectedHolTypes(intGroup)
If (dtHolidayType.Rows.Count > 0) Then
CboNewHolidayType.DataSource = dtHolidayType
CboNewHolidayType.DataTextField = "holidaytype"
CboNewHolidayType.DataValueField = "holiday_type_code_id"
CboNewHolidayType.DataBind()
AddFirstItem(CboNewHolidayType, _CON_COMBO_FIRST_SELECT)
End If
End If
End If
End If
End Sub
#End Region
答案 1 :(得分:1)
这就是你应该这样做的方式。
1。)转到GridView的列编辑器。并将列转换为模板,您要显示DropDownList而不是TextBox。
2.。)转到GridView SmartTag并选择编辑模板选项。在GridView列编辑器中选择您转换为模板的列。
3。)此列将包含所有视图的模板。选择“编辑”视图。这将在那里有TextBox。
4。)删除TxtBox并将DropDownList放在那里。您需要配置DropDownList以使用ObjectDataSource或SqlDataSource填充来自Foreign Table的数据。价值道具。应将DropDownList设置为ForeginTable的P.Key。
5.)现在,将SelectedValue字段绑定到表中的Foregin Key。如果使用Bind,它将执行双向绑定到读/写,如果使用Eval,它将执行OneWay绑定到Read并仅设置默认值。
有关详细信息,请访问此link。
LinkTxt:http://www.asp.net/learn/data-access/tutorial-20-cs.aspx
感谢。
希望这会有所帮助。
答案 2 :(得分:0)
部分答案是DataSources有一个范围。如果您在模板内创建它们,则它们仅对该模板存在。如果你使它们彼此依赖并且在相同的范围内,它们应该级联。