2009-12-04 72 views
2

所以在这个gridview中,有一个状态栏,我希望有一个下拉列表,当点击编辑按钮时,Pass,Pending,Fail出现。这些值已经在一个表中,所以我需要以某种方式将该表绑定到每个行的每个ddl。如何使用VB从数据库表格的GridView中绑定下拉列表?

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

为了清楚起见,我的表名为状态,并且该数据库命名为DirectImport

回答

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') %>"是你错过了拿到状态文成电网的位。

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

<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="<%# Bind('StatusId') %>"是两个数据集,这样,当你翻转一行到编辑模式之间有什么联系起来,在下拉列表已经选择正确的项目,当你再保存它,你已经得到了状态ID来放入你的数据库。
你完成了。

+0

感谢您的好回答。我从来没有使用过这种数据源,所以我对这个椭圆部分的实际情况有点困惑。 – Justen 2009-12-05 18:25:14

+0

就像我说的,当你开始和他们在一起时,他们可能会有一些技巧。我比SqlDataSource更喜欢它们,因为我认为它们可以让你更好地控制底下发生的事情。 如果你能得到一份副本,在第三章的基本ASP.NET中有一个很好的讨论(http://www.amazon.co.uk/Essential-ASP-Net-Microsoft-Net-Development/dp/0321237706/REF = sr_1_1?即= UTF8&S =书籍&QID = 1260039006&SR = 8-1) – PhilPursglove 2009-12-05 18:58:14

0

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

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

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

0

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

2

我已经使用了RowDataBound事件。这是一个小的代码片段。HTH

你将有一个ItemTemplate在你的ASPX/ASCX

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

所以你可能可以决定e什么控件/列隐藏/显示/绑定这一行数据绑定事件

相关问题