views:

821

answers:

4

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.

A: 

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.

Dr. Zim
+1  A: 

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.

this. __curious_geek
Thanks. I'll try to implement this later.
RSolberg
+1  A: 

Refer link below

Cascading dropdownlist in GridView

A: 

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 Paostback set to "true" and define the event for selectindex change of the first dropdown "OnSelectedIndexChanged="CboHolidayGroup_SelectedIndexChanged"" Replce 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" /''0 (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

'> '>

Region "CboHolidayGroup_SelectedIndexChanged"

''' <summary>
''' 
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
''' <remarks></remarks>
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

geetishree rao