如何绑定GridView中的DropDownList与gridview中的数据NOT

问题描述:

获得答案的一半战斗就是知道如何提出问题。我不确定我是否做得很好,但这是我最好的选择。如何绑定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,不承认呢?在网格内部,它从设计师处消失,但在网格外部再次出现。

谢谢大家的帮助。

您有几个选项。您可以使用数据源控件,也可以将代码隐藏在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调用它? –

我看到一些问题。

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中对于应用程序“不可见”,但是当我将它从网格中取出时,它是“是”,我对此没有任何解释 –

您可以简单地创建你想要类型的全局列表,并将其设置为空 如果你正在使用LINQ然后只是把该源在DropDownListObject.DataSource

DropDownListObject.DataSource=ObjListSource; 
DropDownListObject.DataBind; 

希望这会有所帮助。

您解决这个问题:

  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个空格,这使答案更清晰。 –