所以在这个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
答案 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时,数据将在下拉列表中。希望有所帮助!