How can I add cascading drop downs inside of a gridview for edits?

余生长醉 提交于 2019-12-22 14:05:01

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!