2009-12-04 86 views
2

所以在這個gridview中,有一個狀態欄,我希望有一個下拉列表,當點擊編輯按鈕時,Pass,Pending,Fail出現。這些值已經在一個表中,所以我需要以某種方式將該表綁定到每個行的每個ddl。如何使用VB從數據庫表格的GridView中綁定下拉列表?

這是gridview中的列。正如你所看到的,我想只是顯示了當沒有在編輯模式下一個標籤,一個DDL當編輯按鈕被按下

<asp:TemplateField HeaderText="During Production Status" SortExpression="DuringProductionStatus"> 
     <EditItemTemplate> 
      <asp:DropDownList ID="ddlStatus" runat="server" datavaluefield="Name" 
       datatextfield="Name" DataSource="*What goes here?*"> /> 
     </EditItemTemplate> 
     <ItemTemplate> 
      <asp:Label ID="lblStatus" runat="server" 
       Text='I don't understand how to get this from the ddl' /> 
     </ItemTemplate> 
    </asp:TemplateField> 

爲了清楚起見,我的表名爲狀態,並且該數據庫命名爲DirectImport

回答

4

有幾個步驟可以通過這裏 - 他們都不是特別困難,但他們可以有點fiddly(恕我直言)。好消息是,一旦你有這個工作一次,它再次變得更容易做到!

我假設你在頁面上有一個<asp:*DataSource>控件 - 我的首選項是ObjectDataSource,但我認爲它不重要,我認爲SqlDataSource同樣適用。我從來沒有試過在代碼隱藏方面與GridView.DataSource = MyDataSet一起做這件事,所以我不知道這是否可行,但我的假設是,它不會因爲你不會得到適當的雙向綁定想。這個數據源爲您的網格提供主要數據。這裏的關鍵是您的數據庫查詢必須返回狀態文本字段和狀態ID。

所以你的GridView現在看起來像:

<asp:objectdatasource runat="server" id="MainDataSource" ... /> 
<asp:gridview runat="server" id="MyGridView" DataSourceID="MainDataSource"> 
    <Columns> 
     <asp:TemplateField HeaderText="During Production Status" SortExpression="DuringProductionStatus"> 
      <ItemTemplate> 
       <asp:Label ID="lblStatus" runat="server" 
        Text="<%# Bind('Status') %>" /> 
      </ItemTemplate> 
     </asp:TemplateField> 
    </Columns> 
</asp:gridview> 

Text="<%# Bind('Status') %>"是你錯過了拿到狀態文成電網的位。

現在將第二個數據源添加到標記中,該標記從狀態表讀入一組值。

<asp:objectdatasource runat="server" id="StatusObjectDataSource" ... /> 

然後將EditItemTemplate添加到綁定到Status DataSource的GridView中。

<EditItemTemplate> 
    <asp:DropDownList ID="ddlStatus" runat="server" datavaluefield="StatusID" 
     datatextfield="Status" DataSourceID="StatusObjectDataSource" 
     SelectedValue="<%# Bind('StatusId') %>" /> 
</EditItemTemplate> 

SelectedValue="<%# Bind('StatusId') %>"是兩個數據集,這樣,當你翻轉一行到編輯模式之間有什麼聯繫起來,在下拉列表已經選擇正確的項目,當你再保存它,你已經得到了狀態ID來放入你的數據庫。
你完成了。

+0

感謝您的好回答。我從來沒有使用過這種數據源,所以我對這個橢圓部分的實際情況有點困惑。 – Justen 2009-12-05 18:25:14

+0

就像我說的,當你開始和他們在一起時,他們可能會有一些技巧。我比SqlDataSource更喜歡它們,因爲我認爲它們可以讓你更好地控制底下發生的事情。 如果你能得到一份副本,在第三章的基本ASP.NET中有一個很好的討論(http://www.amazon.co.uk/Essential-ASP-Net-Microsoft-Net-Development/dp/0321237706/REF = sr_1_1?即= UTF8&S =書籍&QID = 1260039006&SR = 8-1) – PhilPursglove 2009-12-05 18:58:14

0

在winforms世界中,我將我的對象從數據庫拉入List(Of Whatever)並將列表用作數據源。

這也可以讓我在對象中添加額外的「便利」字段,以便我可以用其他表中的東西填充它。

我根本不知道asp.net,所以如果你可以做類似的事情,它可能會有所幫助。

0

一個非常快速的解決方案是爲狀態下拉菜單創建自定義Web控件。控件將始終包含相同的數據。當它呈現您填充數據源。當它被添加到gridview時,數據將在下拉菜單中。希望有所幫助!

2

我已經使用了RowDataBound事件。這是一個小的代碼片段。HTH

你將有一個ItemTemplate在你的ASPX/ASCX

<asp:TemplateField HeaderText="Column Headings"> 
       <ItemTemplate> 
        <asp:DropDownList ID="ddlName" runat="server" Width="150"></asp:DropDownList> 
       </ItemTemplate> 
       </asp:TemplateField> 

並在後面的代碼,你將有

protected void grdDataMap_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 

    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
     DropDownList ddl = (DropDownList)e.Row.FindControl("ddlName"); 
     ddl.DataSource = someList;//the source of your dropdown 
     ddl.DataBind(); 

    } 

} 

所以當你綁定grdDataMap.Databind網格(假設你的網格ID是grdDataMap),行數據綁定事件將被稱爲每一行(包括頁眉/頁腳,這就是你檢查RowType的原因)

所以你可能可以決定e什麼控件/列隱藏/顯示/綁定這一行數據綁定事件

相關問題