1

我有一个GridView,其中第一列显示一组三个中的冗余数据。我需要消除这种冗余,以便只显示一个代码实例。

这是看起来的GridView样子:

A1234 | Total Entries                  | 1    | 7   |     |                   
A1234 | Equipment Entries              | 1    | 7   |     |                 
A1234 | Total Repair Time              | 60   | 140 |     |                   
B9876 | Total Entries                  | 87   | 36  | 14  | 
B9876 | Equipment Entries              | 87   | 36  | 143 | 
B9876 | Total Repair Time              | 2070 | 790 | 370 |   
C3456 | Total Entries                  | 1    |     |     |        
C3456 | Equipment Entries              | 1    |     |     |       
C3456 | Total Repair Time              | 190  |     |     | 

我希望它看起来像(而且我似乎无法正确格式化),因此在第一列中,代码 A1234、B9876 和 C3456 只显示一次,而不是显示的三次 - 所以有黑色空间/细胞。

我拥有的最新代码基本上是这样的:

protected void gvMetrics_OnRowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {   
        DataRow _data = ((DataRowView)e.Row.DataItem).Row;

        // _lastCode is a clas level variable
        if (_lastCode.ToString() != _data.ItemArray[0].ToString())
        {
            if (_totals == 1)
            {
                _lastCode = _data.ItemArray[0].ToString();
                e.Row.Cells[0].Text = _data.ItemArray[0].ToString();
               _totals++;
            }  
         }
         else
          _totals = 1; // Class level variable initialized to 1.
     }
 }

出于某种原因,我无法格式化代码,但你得到了图片。我在这里的理由是,我会将代码分配给类变量,并且对于每个OnRowDataBaound事件,我都会检查该值是否与当前单元格匹配。如果匹配,请跳过写入GridView/page。那没有用,所以我想我可以使用一个计数器,在第三次事件后将其重置为 1 - 再次不起作用。

我觉得我很接近但没有雪茄!我会想象这在阳光下没有什么新鲜事,所以如果有人能提出解决方案,我将不胜感激!

4

1 回答 1

2

最好的方法是将第一列变成 aTemplateField并添加 aLiteral并实现OnDataBinding事件。

例子:

<asp:TemplateField>
    <ItemTemplate>
        <asp:Literal ID="ltYourField" runat="server"
            OnDataBinding="ltYourField_DataBinding" />
    </ItemTemplate>
</asp:TemplateField>

然后在您的 .cs 代码隐藏中:

// Create a global to store last value found for the field
string _lastValueDisplayed = string.Empty;

实施OnDataBinding

protected void ltYourField_DataBinding(object sender, System.EventArgs e)
{
    Literal lt = (Literal)sender;
    string displayValue = Eval("yourFieldNameFromResult").ToString();
    lt.Text = _lastValueDisplayed.Equals(displayValue) ?
        string.Empty : displayValue;
    // store value for checking on next row
    _lastValueDisplayed = displayValue;
}

尽量不要在其中做绑定的东西,OnRowDataBound因为那样你的代码必须寻找控件。如果您改用 OnDataBinding 将功能与相关控件绑定,则它会将您的代码范围专门用于您想要的控件,并且不会进行搜索。

于 2013-02-01T21:47:54.483 回答