解决此问题的一种方法是处理RowDataBound 事件。它每行引发一次(还有页眉和页脚行,因此您需要过滤DataRow 类型的行)。您可以使用它来调整显示的数据或显示方式。您还可以在事件中设置 DropDown 的值。示例见链接。
为了将 DropDown 列添加到 GridView,请使用 TemplateColumn 并将 DropDown 放入 ItemTemplate。访问 RowDataBound 事件处理程序中的相应单元格。使用 FindControl 方法检索 DropDown 控件并设置其值。
以下示例展示了如何以编程方式设置 Label 和 DropDownList:
网格视图
GridView 显示原始状态和带有长文本、DropDownList 和命令列的新状态以更新数据。
<asp:GridView ID="gdv" runat="server"
OnRowDataBound="gdv_RowDataBound" AutoGenerateColumns="false">
<Columns>
<asp:BoundField DataField="RMAStatus" HeaderText="Original RMA Status" />
<asp:TemplateField HeaderText="Adjusted RMA Status">
<ItemTemplate>
<asp:Label ID="lblStatus" runat="server" />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="New Status">
<ItemTemplate>
<asp:DropDownList ID="ddlStatus" runat="server" />
</ItemTemplate>
</asp:TemplateField>
<asp:CommandField ShowEditButton="true" />
</Columns>
</asp:GridView>
代码隐藏
在代码隐藏中,我定义了一个名为 DataClass 的类,其中包含数据(您也可以使用 DataTable,但对于示例来说,使用类来生成一些数据更容易)。此外,字典包含从短状态到长文本的映射。
Page_Load中设置了字典,如果没有PostBack,则绑定数据。
最后,在gdv_RowDataBound中,为每一行设置了标签,并初始化了DropDownList。请注意,该行的 Label 和 DropDownList 是使用 FindControl 检索的。
public class DataClass
{
public string RMAStatus { get; set; }
}
private readonly Dictionary<string, string> rmaStatusMappings = new Dictionary<string, string>();
protected void Page_Load(object sender, EventArgs e)
{
rmaStatusMappings.Add("R", "Rejected");
rmaStatusMappings.Add("A", "Approved");
rmaStatusMappings.Add("P", "Pending");
if (!IsPostBack)
{
var data = new DataClass[] {
new DataClass() { RMAStatus = "P" },
new DataClass() { RMAStatus = "A" },
new DataClass() { RMAStatus = "R" },
new DataClass() { RMAStatus = "P" },
};
gdv.DataSource = data;
gdv.DataBind();
}
}
protected void gdv_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
var rowStatus = ((DataClass)e.Row.DataItem).RMAStatus;
// Set label to long status
var lblStatus = e.Row.Cells[1].FindControl("lblStatus") as Label;
if (lblStatus != null)
lblStatus.Text = rmaStatusMappings[rowStatus];
// Set drop down items
var ddlStatus = e.Row.Cells[2].FindControl("ddlStatus") as DropDownList;
if (ddlStatus != null)
{
ddlStatus.DataTextField = "Value";
ddlStatus.DataValueField = "Key";
ddlStatus.DataSource = rmaStatusMappings;
ddlStatus.DataBind();
ddlStatus.SelectedValue = rowStatus;
}
}
}
如果您有任何问题,请在 cmets 中告诉我。