获取给定控件的DataGrid标头
本文关键字:DataGrid 标头 控件 获取 | 更新日期: 2023-09-27 18:21:14
您得到的是:对位于ASP.NET DataGrid内的UI控件(例如TextBox)的引用。
您的任务:查找DataGrid列的标题。
我找到了以下解决方案,但我并不特别喜欢它,因为(a)它很复杂,(b)它(ab)使用了有关DataGrid的HTML表示的知识:
-
从UI控件(
ctl
)开始,向上遍历Parent
属性,直到到达TableCell(tc
)及其父DataGridItem(dgi
)。 -
获取DataGrid的
Cells
属性(dgi.Cells.Cast<TableCell>().ToList().IndexOf(tc)
)中TableCell的索引(index
)。 -
进一步遍历
Parent
属性,直到到达DataGrid(grid
),然后使用以下索引访问标题文本:grid.Columns(index).HeaderText
。
我相信这个问题还有一个更优雅的解决方案。它是什么?
DataGrid
还是GridView
?一般来说,TextBox
和标头之间没有关系,因此没有真正优雅的方式。
这是我想出的最好的方法,但我怀疑它是否比你的方法更优雅:
GridView
:
protected void TextBox_TextChanged(object sender, EventArgs e)
{
TextBox txt = (TextBox)sender;
GridViewRow row = (GridViewRow)txt.NamingContainer;
GridView grid = (GridView)row.NamingContainer;
DataControlField column = grid.Columns.Cast<DataControlField>()
.Select((c, Index) => new { Column = c, Index })
.Where(x => row.Cells[x.Index].GetControlsRecursively().Contains(txt))
.Select(x => x.Column)
.FirstOrDefault();
if (column != null)
{
string headerText = column.HeaderText;
}
}
DataGrid
:
protected void TextBox_TextChanged(object sender, EventArgs e)
{
TextBox txt = (TextBox)sender;
DataGridItem item = (DataGridItem)txt.NamingContainer;
DataGrid grid = (DataGrid)item.NamingContainer;
DataControlField column = grid.Columns.Cast<DataControlField>()
.Select((c, Index) => new { Column = c, Index })
.Where(x => item.Cells[x.Index].GetControlsRecursively().Contains(txt))
.Select(x => x.Column)
.FirstOrDefault();
if (column != null)
{
string headerText = column.HeaderText;
}
}
我使用这个扩展方法递归地查找控件:
public static IEnumerable<Control> GetControlsRecursively(this Control parent)
{
foreach (Control c in parent.Controls)
{
yield return c;
if (c.HasControls())
{
foreach (Control control in c.GetControlsRecursively())
{
yield return control;
}
}
}
}
这种方法使用gridView.Columns
集合作为源,因为您希望查找查找列。它需要通过GridViewRow
/DataGridItem
找到TextBox
,并在该项/行的每个单元格中进行递归搜索。如果找到了对TextBox
的引用,则找到了报头。
请注意,您不能使用item.Cells[x.Index].FindControl(txt.ID)
,因为FindControl
首先尝试查找控件的NamingContainer
,即GridViewRow
/DataGridItem
,因此搜索单元格没有帮助。