如何在gridview中添加级联下拉列表以进行编辑?

时间:2009-04-16 05:16:39

标签: asp.net ajax gridview

我有一个相当标准的ASP.NET GridView,它显示了2列具有父子关系的列。虽然数据库中存在A列和B列之间的关系,但GridView不会实现它。

我想做以下事情: 当用户选择编辑该行时,将显示2个下拉菜单。 DropDownB应根据DropDownA的值自动填充可用选项。 DropDownA更改时,需要更新DropDownB以反映当前选项。

目前网格可用的列:

 - ColumnAID
 - ColumnADescription
 - ColumnBID
 - ColumnBDescription

我当然可以在网格之外完成相同的功能,甚至可以让选定的行事件显示模式弹出窗口,允许我相应地编辑字段,但是希望将其保存到网格中。

3 个答案:

答案 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有一个范围。如果您在模板内创建它们,则它们仅对该模板存在。如果你使它们彼此依赖并且在相同的范围内,它们应该级联。