如何在运行时使用AutoGenerate =“True”更改GridView上的字段类型?
问题描述:
我已经创建了一个控件,它扩展了BoundField控件,以对传递给它的数据执行一些特殊处理。如何在运行时使用AutoGenerate =“True”更改GridView上的字段类型?
我现在有一个AutoGenerateColumns =“true”的网格,通过它我想拦截HeaderText,看看它是否是一个特定的值,然后在“SpecialBoundField”中交换。我试过使用OnDataBinding事件循环遍历列,但此时网格中没有列。我认为RowDataBound和DataBound在游戏中太迟了,所以不知道该怎么做。
我的下一个念头,就是覆盖网格控件本身在“AutoGeneratingColumn”事件添加在
protected virtual AutoGeneratedField CreateAutoGeneratedColumn(AutoGeneratedFieldProperties fieldProperties)
谁能帮助或点我一个更好的方向发展?谢谢!
答
如果你有两个字段回来的数据集,我会建议设置列的可见性,而不是试图动态添加或更改数据字段。不可见的列不会呈现任何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;
}
}
}
答
我最终什么了:
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; }
}
}
这可以工作,但我确实需要从简单的“绑定列”,以“SpecialBoundField”改变实际列类型为好。我会放弃并报告。 – rball 2009-09-14 22:38:37
让我到我需要去的地方,我的解决方案也发布了... – rball 2009-09-21 18:07:20