【问题标题】:How to implement conditional formatting in a GridView如何在 GridView 中实现条件格式
【发布时间】:2009-03-19 10:22:07
【问题描述】:

我的 aspx 页面上有一个 GridView,它显示由以下类定义的对象集合

public class Item
{
    public string ItemName{get; set;}
    public object ItemValue{get; set;}
}

然后在我的 aspx 标记中我有这样的东西

<asp:GridView ID="MyTable" runat="server">
    <Columns>
        <asp:BoundField DataField="ItemName" />
        <asp:BoundField DataField="ItemValue" />
    </Columns>
</asp:GridView>

我想知道的是:
有没有办法在 ItemValue 字段上使用条件格式,这样如果对象包含一个字符串,它将返回未更改的字符串,或者如果它包含一个 DateTime,它将显示为 DateTime.ToShortDateString()。

【问题讨论】:

    标签: c# .net gridview asp.net-2.0


    【解决方案1】:

    使用 BoundField 你应该修改你的 Item 类。

    如果您不想修改您的 CodeBehind,那么您可以使用 TemplateField 进行一些技巧:

            <asp:GridView ID="MyTable" runat="server" AutoGenerateColumns="False">
            <Columns>
                <asp:BoundField DataField="ItemName" HeaderText="Name" />
                <asp:TemplateField HeaderText="Value">
                    <ItemTemplate>
                        <asp:Label ID="Label1" runat="server" Text='<%# ((Eval("ItemValue") is DateTime) ? ((DateTime)Eval("ItemValue")).ToShortDateString() : Eval("ItemValue")) %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:GridView>
    

    显然您可以对任何类型的对象执行此操作,但您的“文本”字段可能会变得……复杂……

    顺便说一句.. 我在这个例子中的 CodeBehind 只是你的 Item 类和这个 Page_Load():

        protected void Page_Load(object sender, EventArgs e)
        {
            Item i1 = new Item();
            i1.ItemName = "name1";
            i1.ItemValue = "foo";
            Item i2 = new Item();
            i2.ItemName = "name2";
            i2.ItemValue = DateTime.Now;
            List<Item> list1 = new List<Item>();
            list1.Add(i1);
            list1.Add(i2);
            MyTable.DataSource = list1;
            MyTable.DataBind();
        }
    

    结果是正确的;)

    【讨论】:

      【解决方案2】:

      不确定是否可以使用 BoundField,但如果将其更改为 TemplateField,则可以使用 this link 中的格式化函数。

      比如

      <%# FormatDataValue(DataBinder.Eval(Container.DataItem,"ItemValue")) %>
      

      然后在你的代码隐藏中,你可以添加一个受保护的函数

      Protected Function FormatDataValue(val as object) As String
          'custom enter code hereformatting goes here
      End Function
      

      或者你可以在 gridview 的 OnRowCreated 事件中做一些事情,比如this link

      <asp:GridView ID="ctlGridView" runat="server" OnRowCreated="OnRowCreated" />
      

      此函数是基于数据值是否为空/是否为双精度的条件格式化

      protected void OnRowCreated(object sender, GridViewRowEventArgs e)
      {
          if (e.Row.RowType == DataControlRowType.DataRow)
          {
              DataRowView drv = e.Row.DataItem as DataRowView;
              Object ob = drv["ItemValue"];
      
      
              if (!Convert.IsDBNull(ob) )
              {
                  double dVal = 0f;
                   if (Double.TryParse(ob.ToString(), out dVal))
                   {
                       if (dVal > 3f)
                       {
                           TableCell cell = e.Row.Cells[1];
                           cell.CssClass = "heavyrow";
                           cell.BackColor = System.Drawing.Color.Orange;
                       }
                   }
              }
          }
      }
      

      【讨论】:

        【解决方案3】:

        我决定使用Paul Rowland 解决方案和更多的一件事“如果(e.Item.DataItem 是 DataRowView)”:

            if ((e.Item.ItemType == ListItemType.Item) || (e.Item.ItemType ==                 ListItemType.AlternatingItem))
             {
               if (e.Item.DataItem is DataRowView)
               {
                 DataRowView rowView = (DataRowView)e.Item.DataItem;
                 String state = rowView[PutYourColumnHere].ToString();
                 if (state.Equals("PutYourConditionHere"))
                 {
                   //your formating, in my case....
                   e.Item.CssClass = "someClass";
                 }
               }
             }
        

        【讨论】:

          【解决方案4】:

          在 .NET 2.0 中更容易:

          将此方法添加到代码后面:(此示例将双精度值格式化为 1 位数的百万)

          public string EvalAmount(string expression)
          {
              double? dbl = this.Eval(expression) as double?;
              return dbl.HasValue ? string.Format("{0:0.0}", (dbl.Value / 1000000D)) : string.Empty;
          }
          

          在 aspx 代码中,使用这个:

          <asp:TemplateField ItemStyle-Width="100px">
              <ItemTemplate>
                  <asp:Label runat="server" Text='<%# EvalAmount("MyAmount") %>'></asp:
              </ItemTemplate>
          </asp:TemplateField>
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-03-03
            • 1970-01-01
            • 2012-05-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-11-07
            相关资源
            最近更新 更多