首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从DataGridColumn获取DataGridColumnHeader?

如何从DataGridColumn获取DataGridColumnHeader?
EN

Stack Overflow用户
提问于 2010-10-27 15:11:51
回答 2查看 14.9K关注 0票数 8

我的代码如下:

代码语言:javascript
复制
 void mainDataContextObj_CutSelectedColumnEvent(string columnId)
    {
        IList<DataGridColumn> columns = dg.Columns;

        for(int i=2; i<dg.Columns.Count; i++)
        {
            DataGridColumnHeader headerObj = dg.Columns[i].Header as DataGridColumnHeader;

             //This always returns headerObj as null!!!

        }
    }

我需要专栏里的DataGridColumnHeader。我哪里错了?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-10-27 16:33:17

无论您将其设置为什么,DataGridColumn的Header对象实际上都是该列的可见标题。DataGridColumn不是可视化树的一部分,所以没有直接访问它的DataGridColumnHeader的方法(我们甚至还不能确定它是否存在)。但是您可以这样做来尝试访问它

代码语言:javascript
复制
DataGridColumnHeader headerObj = GetColumnHeaderFromColumn(column);

private DataGridColumnHeader GetColumnHeaderFromColumn(DataGridColumn column)
{
    // dataGrid is the name of your DataGrid. In this case Name="dataGrid"
    List<DataGridColumnHeader> columnHeaders = GetVisualChildCollection<DataGridColumnHeader>(dataGrid);
    foreach (DataGridColumnHeader columnHeader in columnHeaders)
    {
        if (columnHeader.Column == column)
        {
            return columnHeader;
        }
    }
    return null;
}

public List<T> GetVisualChildCollection<T>(object parent) where T : Visual
{
    List<T> visualCollection = new List<T>();
    GetVisualChildCollection(parent as DependencyObject, visualCollection);
    return visualCollection;
}

private void GetVisualChildCollection<T>(DependencyObject parent, List<T> visualCollection) where T : Visual
{
    int count = VisualTreeHelper.GetChildrenCount(parent);
    for (int i = 0; i < count; i++)
    {
        DependencyObject child = VisualTreeHelper.GetChild(parent, i);
        if (child is T)
        {
            visualCollection.Add(child as T);
        }
        else if (child != null)
        {
            GetVisualChildCollection(child, visualCollection);
        }
    }
}
票数 18
EN

Stack Overflow用户

发布于 2014-06-08 16:32:09

虽然Fredrik's answer提供了一种重构的方法,提供了额外的方法,可以在代码的其他部分重用,但我更喜欢将他的方法合并到一个方法中。也可能会有一些小的性能提升,因为它可以在找到标题后立即结束搜索,并且不需要继续搜索视觉树中的所有子对象(这在大多数情况下很可能可以忽略)。

代码语言:javascript
复制
private DataGridColumnHeader GetHeader(DataGridColumn column, DependencyObject reference)
{
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(reference); i++)
    {
        DependencyObject child = VisualTreeHelper.GetChild(reference, i);

        DataGridColumnHeader colHeader = child as DataGridColumnHeader;
        if ((colHeader != null) && (colHeader.Column == column))
        {
            return colHeader;
        }

        colHeader = GetHeader(column, child);
        if (colHeader != null)
        {
            return colHeader;
        }
    }

    return null;
}

它的用法如下:

代码语言:javascript
复制
DataGridColumnHeader colHeader = GetHeader(column, myDataGrid);
if (colHeader == null) { /* Not found */ }
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4030764

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档