Как я могу добавить каскадные выпадающие списки внутри сетки для правок? - PullRequest
2 голосов
/ 16 апреля 2009

У меня довольно стандартный ASP.NET GridView, который отображает 2 столбца, которые имеют родительские дочерние отношения. Хотя в базе данных существует связь между столбцом A и столбцом B, GridView не реализует ее.

Я бы хотел сделать следующее: Когда пользователь выбрал редактирование строки, становятся доступны 2 раскрывающихся меню. DropDownB должен автоматически заполняться доступными опциями, основанными на значении DropDownA. Когда DropDownA изменяется, DropDownB необходимо обновить, чтобы отразить текущие параметры.

Столбцы, в настоящее время доступные для сетки:

 - ColumnAID
 - ColumnADescription
 - ColumnBID
 - ColumnBDescription

Я, безусловно, могу выполнить эту же функциональность за пределами сетки, даже если в выбранном событии строки отображается модальное всплывающее окно, позволяющее мне соответствующим образом редактировать поля, но я хотел бы сохранить это в сетке.

Ответы [ 3 ]

2 голосов
/ 25 июня 2010

В приведенных ниже примерах показаны 2 раскрывающихся списка «Группа праздников» и «Тип праздника». В зависимости от выбора группы праздников будет загружен раскрывающийся список типов праздников. Подвох здесь в том, что Auto Postback установлен на «true» и определяет событие для изменения индекса select первого выпадающего списка OnSelectedIndexChanged="CboHolidayGroup_SelectedIndexChanged"
Замените "(" и ")" на "<" и ">" соответственно.
Приведенный ниже код можно использовать для каскадных выпадающих меню в виде сетки:

Страница дизайна

(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 голос
/ 16 апреля 2009

Вот так и надо.

1.) Перейти к редактору столбцов GridView. И преобразовать Столбец в Шаблон, который вы хотите отобразить DropDownList вместо TextBox.

2.) Перейдите в GridView SmartTag и выберите параметр «Редактировать шаблоны». Выберите столбец, преобразованный в шаблон, в редакторе столбцов GridView.

3.) Этот столбец будет иметь шаблон для всех видов. Выберите режим редактирования. Там уже будет TextBox.

4.) Удалите TxtBox и поместите туда DropDownList. Вам необходимо настроить DropDownList для заполнения данных из внешней таблицы с помощью ObjectDataSource или SqlDataSource. Значение проп. DropDownList должен быть установлен в P.Key ForeginTable.

5.) Теперь свяжите поле SelectedValue с ключом Foregin в вашей таблице. Если вы используете Bind, он будет выполнять двустороннюю привязку для чтения / записи, если вы используете Eval, он будет выполнять привязку OneWay к Read и устанавливать только значение по умолчанию.

Для получения дополнительной информации посетите эту ссылку .

LinkTxt: http://www.asp.net/learn/data-access/tutorial-20-cs.aspx

Спасибо.

надеюсь, это поможет.

0 голосов
/ 16 апреля 2009

Частичный ответ заключается в том, что источники данных имеют область действия. Если вы создаете их внутри шаблона, они существуют только для этого шаблона. Если вы сделаете их зависимыми друг от друга и в одной области видимости, они должны каскадироваться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...