【问题标题】:How do I data bind a drop down list in a gridview from a database table using VB?如何使用 VB 从数据库表中数据绑定网格视图中的下拉列表?
【发布时间】:2009-12-04 17:59:58
【问题描述】:

因此,在此网格视图中,有一个状态列,我希望在单击编辑按钮时出现一个包含 Pass、Pending、Fail 的下拉列表。这些值已经在一个表中,所以我需要以某种方式从这个表绑定到每一行的每个 ddl。

这是来自 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>

为了清楚起见,我的表命名为 Status,数据库命名为 DirectImport

【问题讨论】:

    标签: asp.net vb.net gridview drop-down-menu


    【解决方案1】:

    这里有几个步骤要完成 - 它们都不是特别困难,但它们可能有点繁琐(恕我直言)。好消息是一旦你完成了这项工作,再做一次就会变得更容易!

    我假设您的页面上有一个&lt;asp:*DataSource&gt; 控件 - 我更喜欢 ObjectDataSource,但我认为这并不重要,我认为 SqlDataSource 也同样适用。我从来没有尝试过在代码隐藏中使用GridView.DataSource = MyDataSet 这样做,所以我不知道这是否可行,但我的假设是它不会因为你不会得到正确的双向绑定你要的那个。此数据源为您的网格提供主要数据。这里的关键点是您的数据库查询必须同时返回 Status 文本字段和 Status 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="&lt;%# Bind('Status') %&gt;" 是将状态文本输入网格所缺少的位。

    现在将第二个数据源添加到您的标记中,该数据源从状态表中读取一组值。

    <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="&lt;%# Bind('StatusId') %&gt;" 将两个数据集连接起来,因此当您将一行翻转到编辑模式时,下拉列表已经选择了正确的项目,然后保存它时,您就有了要放入的状态 ID您的数据库。
    你就完成了。

    【讨论】:

    • 感谢您的出色回答。我从来没有使用过那种数据源,所以我对椭圆部分的实际情况有点困惑。
    • 就像我说的,当您开始使用它们时,它们可能会有点棘手。我更喜欢它们而不是 SqlDataSource,因为我认为它们可以让您更好地控制引擎盖下发生的事情。如果你能得到一份副本,在 Essential ASP.NET 第三章中有很好的讨论(amazon.co.uk/Essential-ASP-Net-Microsoft-Net-Development/dp/…
    【解决方案2】:

    我使用了 RowDataBound 事件。这是一个小代码sn-p。高温

    你会在你的 aspx/ascx 中有一个 ItemTemplate

    <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 的原因)

    因此您可能可以决定在此行数据绑定事件中隐藏/显示/绑定哪些控件/列

    【讨论】:

      【解决方案3】:

      在 winforms 世界中,我将我的对象从数据库中拉入一个 List(Of What) 并使用该列表作为数据源。

      这也让我可以在对象中添加额外的“便利”字段,以便我可以用其他表中的内容填充它。

      我根本不了解 asp.net,所以如果你能做类似的事情,它可能会有所帮助。

      【讨论】:

        【解决方案4】:

        一个非常快速的解决方案是为状态下拉菜单创建一个自定义 Web 控件。控件将始终包含相同的数据。当它呈现时,您填充数据源。当它被添加到 gridview 时,数据将在下拉列表中。希望对您有所帮助!

        【讨论】:

          猜你喜欢
          • 2012-09-16
          • 1970-01-01
          • 1970-01-01
          • 2012-07-09
          • 1970-01-01
          • 2012-07-13
          • 2011-04-12
          • 2012-07-31
          • 1970-01-01
          相关资源
          最近更新 更多