【问题标题】:How to bind DropDownList in Gridview with data NOT from gridview如何将Gridview中的DropDownList与不是来自gridview的数据绑定
【发布时间】:2011-11-16 14:05:36
【问题描述】:

获得答案的一半是知道如何提出问题。我不确定我是否做得很好,但这是我最好的选择。

我正在尝试将 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 也无法识别?在网格内部,它会从设计器中消失,但在网格外部,它会重新出现。

感谢大家的帮助。

【问题讨论】:

    标签: asp.net gridview


    【解决方案1】:

    您有几个选择。您可以使用数据源控件,也可以在 GridView 的 RowDataBound 事件的代码隐藏中绑定下拉列表。

    我也注意到您的代码中存在一些问题。在您的示例中,您错误地分配了DataSourceID。 DataSourceID 应该指向页面上数据源控件的 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
    

    【讨论】:

    • 过去我已经成功地使用 ObjectDataSource 完成了类似的操作,但我试图仅通过这次背后的代码来完成此操作。这可能吗?
    • 关于 ConnectionStrings 属性。我被分配附加的应用程序使用 appSettings 中的一个键,而不是配置文件中的普通连接字符串属性。有没有办法从 sqldatasource 调用它?
    • @JohnKinane:我认为你仍然可以绑定OnRowDataBound。如果该行处于编辑模式,我编辑了我的答案以绑定下拉列表。
    • 是的。其目的是允许用户从查找 sp. 中选择不同的选项。
    • @JamesJohnson:我面临同样的问题,无法获取网格视图内下拉列表中的值。我需要在 c# 中使用相同的 vb 代码。请帮忙
    【解决方案2】:

    您可以简单地创建所需类型的全局列表并将其设置为 null 如果您使用的是 linq,那么只需将该源放入 DropDownListObject.DataSource

    DropDownListObject.DataSource=ObjListSource;
    DropDownListObject.DataBind;
    

    希望对您有所帮助。

    【讨论】:

      【解决方案3】:

      我发现了几个问题。

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

      你为什么要这样做?为什么要在网格上已经被填充的事件上再次绑定网格?

      【讨论】:

      • 你答案的第二部分不正确。使用该 ID 查找控件应该没有问题。
      • 我应该注意到,在使用 VS 2010 时,ddl 控件,而在 gridview 中对应用程序“不”可见,但是当我将它从网格中取出时,它“是”。我有对此没有任何解释。
      【解决方案4】:

      你解决这个问题:

      1. 在代码页中,您定义了一个 GetListData() 公共函数(我认为您这样做了)。

      2. 使用 DataSource 属性(如果要调用函数):

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

      【讨论】:

      • 感谢您的回答。如果您在行尾留出 2 个空格,则可以在内容中添加一些换行符。这使答案更加清晰。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多