2011-11-16 98 views
7

獲得答案的一半戰鬥就是知道如何提出問題。我不確定我是否做得很好,但這是我最好的選擇。如何綁定GridView中的DropDownList與gridview中的數據NOT

我想綁定一個ddl,而不是來自gridview本身的gridview中的數據。這是在EditItemTemplate中。這樣做的目的是讓用戶從查找存儲過程開始選擇一個值和一系列其他值。

我會在這裏提到,我已經成功地完成了這之前,但使用ObjectDataSource。我試圖避免這一次,並完全從後面的代碼完成,然後將其移至數據層。

這裏是我迄今爲止...

<asp:GridView ID="usersGrid" runat="server"     
     DataKeyNames="userID" 
     AutoGenerateColumns="false" Width="580" 
     OnRowUpdating="usersGrid_RowUpdating" 
     OnRowEditing="usersGrid_RowEditing" 
     OnRowCancelingEdit="usersGrid_RowCancelingEdit"         OnRowDeleting="usersGrid_RowDeleting" 
     > 

...

<EditItemTemplate> 
       <div class="gridName"> 
        <asp:TextBox ID="txtFirstName" Text='<%#Eval("firstName") %>' runat="server" Width="95" /> 
       </div> 
       <div class="gridName"> 
        <asp:TextBox ID="txtLastName" Text='<%#Eval("lastName") %>' runat="server" Width="95" /> 
       </div> 
       <div class="gridEmail"> 
        <asp:TextBox ID="txtEmail" Text='<%#Eval("email") %>' runat="server" Width="245" /> 
       </div> 
       <div class="gridName"> 
        <asp:DropDownList ID="ddl_GetLists" 
        DataSourceID="GetListData()" 
        AppendDataBoundItems="true" 
        DataValueField="listID" 
        DataTextField="listName" 
        SelectedValue='<%#Bind("listID") %>' 
        runat="server" 
        > 
        </asp:DropDownList> 
       </div> 
      </EditItemTemplate> 

....

Protected Sub usersGrid_RowEditing(ByVal sender As Object, ByVal e As GridViewEditEventArgs) 
    usersGrid.EditIndex = e.NewEditIndex 
    BindData() 

End Sub 

....

Private Sub BindData() 
    Dim conn As New SqlConnection(connectionString) 
    Dim ad As New SqlDataAdapter("MAINT_DIST_GET_USERS", conn) 
    Dim ds As New DataSet() 
    ad.Fill(ds) 
    GetListData() 
    usersGrid.DataSource = ds 
    usersGrid.DataBind() 

End Sub 

我包括了最後兩個以及其他我嘗試過但失敗的方法。

...

Protected Sub usersGrid_RowDataBound(ByVal sender As Object, ByVal e As GridViewRowEventArgs) 
    If e.Row.RowState = DataControlRowState.Edit Then 
     Dim ddl As DropDownList = DirectCast(e.Row.FindControl("ddl_GetLists"), DropDownList) 

     Dim conn As New SqlConnection(connectionString) 
     Dim ad As New SqlDataAdapter("MAINT_DIST_GET_LISTS", conn) 
     Dim ds As New DataSet() 
     ad.Fill(ds) 

     ddl.DataSource = ds 
     ddl.DataBind() 
    End If 
End Sub 

Public Function BindDropdown() As DataSet 
    Dim conn As New SqlConnection(connectionString) 
    Dim ad As New SqlDataAdapter("MAINT_DIST_GET_LISTS", conn) 
    Dim ds As New DataSet() 
    ad.Fill(ds) 

    ddl_GetLists.DataSource = ds 
    ddl_GetLists.DataBind() 
End Function 

我還會問,爲什麼在最後的功能,爲什麼控制,ddl_GetLists,不承認呢?在網格內部,它從設計師處消失,但在網格外部再次出現。

謝謝大家的幫助。

回答

11

您有幾個選項。您可以使用數據源控件,也可以將代碼隱藏在GridView的RowDataBound事件中的下拉列表中。

我注意到你的代碼也有一些問題。在你的例子中,你錯誤地分配了DataSourceID。該DataSourceID應該指向一個頁面上DataSource控件的ID:

<asp:DropDownList ID="ddl_GetLists"  
    DataSourceID="SqlDataSource1"  
    AppendDataBoundItems="true"  
    DataValueField="listID"  
    DataTextField="listName"  
    SelectedValue='<%#Bind("listID") %>'  
    runat="server">  
</asp:DropDownList> 

<asp:SqlDataSource ID="SqlDataSource1" runat="server"     
    ConnectionString="<%$ ConnectionStrings:ConnectionString %>"     
    SelectCommand="SELECT listID, listName FROM SomeTable">            
</asp:SqlDataSource> 

如果你想要做的代碼隱藏綁定,就可以通過RowDataBound事件做到這一點:

Protected Sub GridView1_RowDataBound(sender As Object, e As GridViewRowEventArgs) 
    If e.Row.RowType = DataControlRowType.DataRow AndAlso (e.Row.RowState And DataControlRowState.Edit) = DataControlRowState.Edit Then 
     Dim ddl As DropDownList = TryCast(e.Row.FindControl("ddl_GetLists"), DropDownList) 
     If ddl IsNot Nothing Then 
      ddl.DataSource = RetrieveDataSource() 
      ddl.DataBind() 
     End If 
    End If 
End Sub 
+0

我已經成功地完成了過去使用的ObjectDataSource,但我想這樣做類似這樣的東西僅限於此時的代碼。這可能嗎? –

+0

是的,絕對。給我一秒鐘,我會更新我的答案。 –

+0

關於ConnectionStrings屬性。我已分配給追加的應用使用appSettings中的一個鍵,而不是來自配置文件的正常connectionstring屬性。有沒有辦法從sqldatasource調用它? –

0

我看到一些問題。

Protected Sub usersGrid_RowEditing(ByVal sender As Object, ByVal e As GridViewEditEventArgs) 
    usersGrid.EditIndex = e.NewEditIndex 
    BindData() 

End Sub 

你爲什麼這樣做?爲什麼你會在網格上已經被填充的事件上再次綁定網格?

+1

答案的第二部分不正確。使用該ID找到控件應該沒有問題。 –

+0

你是對的。我會更新。 – Etch

+0

我應該注意的是,在使用VS 2010時,ddl控件在gridview中對於應用程序「不可見」,但是當我將它從網格中取出時,它是「是」,我對此沒有任何解釋 –

1

您可以簡單地創建你想要類型的全局列表,並將其設置爲空 如果你正在使用LINQ然後只是把該源在DropDownListObject.DataSource

DropDownListObject.DataSource=ObjListSource; 
DropDownListObject.DataBind; 

希望這會有所幫助。

0

您解決這個問題:

  1. 在代碼頁中,定義一個GetListData()函數public function(我認爲你做)。

  2. 使用DataSource屬性(如果你要調用一個函數):

      <asp:DropDownList ID="ddl_GetLists" 
               DataSource='<%# GetListData() %>' 
               AppendDataBoundItems="true" 
               DataValueField="listID" 
               DataTextField="listName" 
               SelectedValue='<%#Bind("listID") %>' 
               runat="server" > 
          </asp:DropDownList> 
    
+0

你爲你的答案,你可以在你的內容中加入一些換行符,如果你在行末加上2個空格,這使答案更清晰。 –

相關問題