2009-04-16 47 views
2

我有一個相當標準的ASP.NET GridView,顯示2列有父子關係的列。儘管關係存在於列A和列B之間的數據庫中,但GridView並未實現它。如何在gridview中添加級聯下拉菜單以進行編輯?

我想要做以下事情: 當用戶選擇編輯行時,會出現2個下拉菜單。 DropDownB應該根據DropDownA的值自動填充可用的選項。當DropDownA發生變化時,DropDownB需要更新以反映當前選項。

列目前可供網格:

- ColumnAID 
- ColumnADescription 
- ColumnBID 
- ColumnBDescription 

我一定可以做到網格超出此相同的功能,甚至可以有選擇的行事件顯示一個模式彈出讓我相應地編輯字段,但想要保持這個網格。

回答

1

這是你應該如何做到的。

1.)轉到GridView的列編輯器。並將列轉換爲您想要顯示DropDownList而不是TextBox的模板。

2.)轉到GridView SmartTag並選擇編輯模板選項。在GridView列編輯器中選擇您轉換爲模板的列。

3.)此列將具有所有視圖的模板。選擇編輯視圖。這裏已經有了TextBox。

4.)刪除TxtBox並在那裏放置一個DropDownList。您需要配置DropDownList以使用ObjectDataSource或SqlDataSource填充來自外部表的數據。價值道具。 DropDownList的值應該設置爲ForeginTable的P.Key。

5.)現在,將SelectedValue字段綁定到表中的Foregin Key。如果使用綁定,它將執行雙向綁定到讀/寫,如果使用Eval,它將執行單向綁定到讀取並僅設置默認值。

欲瞭解更多信息,請訪問link

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

感謝。

希望這有助於。

+0

謝謝。我會稍後嘗試實施。 – RSolberg 2009-04-16 16:07:44

0

部分答案是DataSources有一個範圍。如果您在模板內部創建它們,它們只存在於該模板中。如果你讓他們彼此依賴並且在相同的範圍內,他們應該級聯。

2

以下示例顯示2個下拉菜單假日組和假期類型。 根據Holiday Group的選擇,假日類型下拉列表將被加載。 此處的捕捉是將「自動回傳」設置爲「true」,併爲第一個下拉列表的selectindex更改定義事件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