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
в качестве источника, так как вы хотите найти столбец. Он должен найти TextBox
через GridViewRow
/DataGridItem
и рекурсивный поиск в каждой ячейке этого товара/строки. Если найдена ссылка на TextBox
, заголовок находится.
Обратите внимание, что вы не можете использовать item.Cells[x.Index].FindControl(txt.ID)
с момента FindControl
первых попыток найти NamingContainer
элемента управления, который является GridViewRow
/DataGridItem
так это не помогает искать клетки.
'DataGrid' или' GridView'? В общем, нет никакой связи между вашим текстовым полем и заголовком, поэтому нет более элегантного способа. –
@TimSchmelter: DataGrid. Я знаю, что GridView - это более современная альтернатива, но это унаследованный проект. – Heinzi
Это уже самое лучшее, нет элегантного способа. Если это устаревший проект, можно использовать LINQ вообще? –