在 OnRowDataBound 事件的网格视图中设置数据的格式
本文关键字:置数据 格式 网格 OnRowDataBound 事件 视图 | 更新日期: 2023-09-27 17:57:10
>我有一个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 - 同样不起作用。
我觉得我离得很近,但没有雪茄!我想这在阳光下并不是什么新鲜事,所以如果有人能提出解决方案,我将不胜感激!
执行此操作
的最佳方法是将第一列设置为TemplateField
,并添加实现OnDataBinding
事件的Literal
。
例:
<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 将功能绑定到相关控件,则会将代码的范围专门限定为所需的控件,并且不会进行搜索。