如何使用VB从数据库表中绑定gridview中的下拉列表?

时间:2009-12-04 17:59:58

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

所以在这个gridview中,有一个状态列,我希望在单击编辑按钮时出现一个包含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

4 个答案:

答案 0 :(得分: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') %>"是您将状态文本放入网格中所缺少的。

现在将第二个数据源添加到标记中,该标记从Status表中读取值集。

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

将EditItemTemplate添加到GridView中,GridView绑定到Status DataSource。

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

SelectedValue="<%# Bind('StatusId') %>"是连接两个数据集的内容,这样当您将一行切换到编辑模式时,下拉列表中已经选择了正确的项目,然后当您保存它时,您将获得状态ID放入你的数据库 你已经完成了。

答案 1 :(得分:2)

我使用过RowDataBound事件。这是一个小代码片段。 HTH

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

因此您可以决定在此行数据绑定事件

中隐藏/显示/绑定哪些控件/列

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

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