如何在GridView中的某些条件下更改文本?

时间:2014-03-08 06:43:46

标签: c# asp.net gridview

我想在GridView中更改特定条件下单元格的文本/值。当我从数据库绑定Gridview时,我有一个返回'P','A','R'的单元格。我希望在“P”的情况下显示“待定”,在“A”的情况下显示“已批准”,在使用更新按钮的下拉列表中显示“已拒绝”时显示“已拒绝”。我想改变记录的状态。

如何更改文本并在绑定数据时执行所需的任务。

<asp:TemplateColumn> 
  <HeaderStyle CssClass="bgB white p5 b treb ttu w10" />
  <HeaderTemplate> 
    <asp:Label ID="lblstatus" runat="server" Text="Status"></asp:Label>       
  </HeaderTemplate> 
  <ItemTemplate> 
    <asp:Label ID="lblrmastatus" runat="server" Text='<%# Bind("RMA_STATUS") %>'>
    </asp:Label> 
  </ItemTemplate> 
</asp:TemplateColumn>

1 个答案:

答案 0 :(得分:0)

解决此问题的方法是处理RowDataBound事件。它每行引发一次(也是页眉和页脚行,因此您需要筛选类型为DataRow的行)。您可以使用它来调整显示的数据或显示的方式。您还可以在事件中设置DropDown的值。请参阅示例链接。

为了将DropDown-column添加到GridView,请使用TemplateColumn并将DropDown放入ItemTemplate。访问RowDataBound事件处理程序中的相应单元格。使用FindControl方法检索DropDown控件并设置其值。


以下示例显示如何以编程方式设置Label和DropDownList:

GridView的

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>

代码隐藏

在Code-behind中,我定义了一个名为DataClass的类,其中包含数据(您也可以使用DataTable,但对于示例,使用类更容易生成一些数据)。此外,字典包含从短状态到长文本的映射。

Page_Load中,设置了字典,如果没有PostBack,则绑定数据。

最后,在gdv_RowDataBound中,为每一行设置标签,并初始化DropDownList。请注意,使用FindControl检索行的Label和DropDownList。

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;
        }
    }
}

如果您有任何问题,请在评论中告诉我。