我创建了一个控件,它扩展了BoundField控件,对传入其中的数据进行了一些特殊处理。
我现在有一个AutoGenerateColumns =“true”的网格,我想通过它拦截HeaderText,看看它是否是一个特定的值,然后交换“SpecialBoundField”。我已经尝试使用OnDataBinding事件循环遍历列,但此时网格中没有列。我认为RowDataBound和DataBound在游戏中为时已晚,所以不确定该怎么做。
我的下一步想法是覆盖网格控件本身以添加“AutoGeneratingColumn”事件
protected virtual AutoGeneratedField CreateAutoGeneratedColumn(AutoGeneratedFieldProperties fieldProperties)
任何人都可以帮助或指出我更好的方向吗?谢谢!
答案 0 :(得分:3)
如果您在数据集中有两个字段,我建议设置列可见性,而不是尝试动态添加或更改数据字段。不可见的列不会呈现任何HTML,因此只需在绑定时查看标题行,检查您感兴趣的字段以及设置列可见性。
void myGridView_RowDataBound(Object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.Header)
{
if (e.Row.Cells[1].Text = "BadText")
{
myGridView.Columns[1].Visible = false;
myGridView.Columns[5].Visible = true;
}
}
}
答案 1 :(得分:1)
我最终得到了什么:
public class SpecialGridView : GridView
{
protected override void OnRowDataBound(GridViewRowEventArgs e)
{
ModifyData(e);
base.OnRowDataBound(e);
}
IList<string> _columnNames = new List<string>();
protected void ModifyData(GridViewRowEventArgs e)
{
LoadColumnNames(e);
if (e.Row.RowType == DataControlRowType.DataRow)
{
for (int i = 0; i < e.Row.Cells.Count; i++)
{
string currentColumnName = _columnNames[i];
if (IsSpecialColumn(currentColumnName))
{
string text = e.Row.Cells[0].Text;
bool isSpecialData = text.ToUpper() == "Y";
if (isSpecialData)
{
e.Row.Cells[i].CssClass += " specialData";
}
}
}
}
}
private void LoadColumnNames(GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.Header)
{
foreach (TableCell cell in e.Row.Cells)
{
_columnNames.Add(cell.Text);
}
}
}
private bool IsSpecialColumn(string currentColumnName)
{
foreach (string columnName in SpecialColumnNames)
{
if (currentColumnName.ToUpper() == columnName.ToUpper())
{
return true;
}
}
return false;
}
private IList<string> _specialColumnNames = new List<string>();
public IList<string> SpecialColumnNames
{
get { return _specialColumnNames; }
set { _specialColumnNames = value; }
}
}