获取给定控件的DataGrid标头

本文关键字:DataGrid 标头 控件 获取 | 更新日期: 2023-09-27 18:21:14

您得到的是:对位于ASP.NET DataGrid内的UI控件(例如TextBox)的引用。

您的任务:查找DataGrid列的标题。


我找到了以下解决方案,但我并不特别喜欢它,因为(a)它很复杂,(b)它(ab)使用了有关DataGrid的HTML表示的知识:

  1. 从UI控件(ctl)开始,向上遍历Parent属性,直到到达TableCell(tc)及其父DataGridItem(dgi)。

  2. 获取DataGrid的Cells属性(dgi.Cells.Cast<TableCell>().ToList().IndexOf(tc))中TableCell的索引(index)。

  3. 进一步遍历Parent属性,直到到达DataGrid(grid),然后使用以下索引访问标题文本:grid.Columns(index).HeaderText

我相信这个问题还有一个更优雅的解决方案。它是什么?

获取给定控件的DataGrid标头

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,因此搜索单元格没有帮助。