问题
I have a fairly standard ASP.NET GridView that displays 2 columns that have a parent child relationship. Although the relationship exists in the database between column A and column B, the GridView does not implement it.
I would like to do the following: When the user has elected to edit the row, 2 dropdown menus become visible. The DropDownB should automatically be populated with the available options based upon DropDownA's value. When DropDownA changes, DropDownB needs to be updated to reflect the current options.
Columns currently available to the grid:
- ColumnAID
- ColumnADescription
- ColumnBID
- ColumnBDescription
I can certainly accomplish this same functionality outside of the grid, could even have a selected row event display a modal popup allowing me to edit the fields accordingly, but would like to keep this contained to the grid.
回答1:
This is how you should so It.
1.) Goto Column editor of the GridView. And convert the Column to Template which you want to display the DropDownList instead of the TextBox.
2.) Goto GridView SmartTag and select the Option to Edit Templates. Select the Column you converted into Template in GridView Column Editor.
3.) This Column will have the Template for all the Views. Select the Edit view. This will already have TextBox there.
4.) Remove the TxtBox and put a DropDownList there. You need to configure the DropDownList to populate the data from Foreign Table by using ObjectDataSource or SqlDataSource. The Value prop. of the DropDownList should be set to P.Key of the ForeginTable.
5.) Now, bind the SelectedValue field to the Foregin Key in your table. If you use Bind it will perform Two-Way binding to Read/Write, If you use Eval it will perform OneWay binding to Read and set the default value only.
For more info visit this link.
LinkTxt: http://www.asp.net/learn/data-access/tutorial-20-cs.aspx
Thanks.
hope this helps.
回答2:
The below examples show 2 dropdowns Holiday group and Holiday Type.
Based on the selection of Holiday Group, the holiday type dropdown will be loaded.
The catch here is the Auto Postback set to "true" and define the event for selectindex change of the first dropdown OnSelectedIndexChanged="CboHolidayGroup_SelectedIndexChanged"
Replace the "(" and ")" with "<" and ">" respectively.
The below code can be used for cascading dropdowns inside a grid view:
Design page
(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)
Code Behind and Design
<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
回答3:
A partial answer is that DataSources have a scope. If you create them inside of a template, they only exist for that template. If you make them dependent on each other and in the same scope, they should cascade.
来源:https://stackoverflow.com/questions/754823/how-can-i-add-cascading-drop-downs-inside-of-a-gridview-for-edits