如何在wpf c#中通过编程隐藏数据网格的单元格

本文关键字:数据 隐藏 数据网 网格 单元格 编程 wpf | 更新日期: 2023-09-27 18:07:24

是否有任何方法可以隐藏/折叠代码隐藏中的特定dataGrid单元格?由于我的数据表列是在运行时创建的,所以我无法指定属性(在XAML中)来正确设置这些数据触发器、模板选择器等。但是,通过循环遍历数据表,将行/列索引添加到List(如下),我能够找到我想要折叠的确切单元格。

我知道这是不正统的,但我已经读了几个星期的线程试图解决这个问题,没有得到我那里。这似乎是最简单的解决方案(如果可能的话)。

private static List<KeyValuePair<int, int>> GetCellsToHide(DataTable pivotTable)
{
    var noCellValueList = new List<KeyValuePair<int, int>>();
    foreach (DataRow row in pivotTable.Rows)
    {
        foreach (DataColumn col in pivotTable.Columns)
        {
            if (row[col].ToString() == "HideMe")
            {
                int rowIndex = pivotTable.Rows.IndexOf(row);
                int colIndex = pivotTable.Columns.IndexOf(col);
                noCellValueList.Add(new KeyValuePair<int, int>(rowIndex, colIndex));
            }
        }
    }
    return noCellValueList;
}

编辑:datatemplate &转换器信息

我目前正在通过自动生成列构建数据网格。我知道所有其他列的名称,因此可以将范围缩小到动态生成的列。例如,我的动态列是DataTemplate5(简化版本如下):

private void DataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
    if (e.Column.Header.ToString() == "Name")
        e.Column.Header = "File Name";
    else
    {
        string origHeader = e.Column.Header.ToString();
        DataGridTemplateColumn templateColumn = new DataGridTemplateColumn    //create new template column
        {
             Header = origHeader,
             CellTemplate = (DataTemplate)Resources["DataTemplate5"]
        }; 
        e.Column = templateColumn; // Replace the auto-generated column with the templateColumn.    
    }
}

但是由于我没有要绑定的属性(列)名称,所以我无法正确绑定它。这是我通过数据模板隐藏细胞的最新尝试&ivalueconverter:

<DataTemplate x:Key="DataTemplate5">
    <DataTemplate.Resources>
        <local:StringToVisibilityConvertor x:Key="VisibilityConvertor" />
    </DataTemplate.Resources>
    <StackPanel Visibility="{Binding BindsDirectlyToSource=True, Converter={StaticResource VisibilityConvertor}}">
        <Button Name="Button1" Click="ButtonClick">
            <Button.Style>
                <Style  TargetType="Button">
                    <Style.Setters>
                        <Setter Property="Background" Value="Orange"/>
                    </Style.Setters>
                </Style>
            </Button.Style>
        </Button>
    </StackPanel>
</DataTemplate>

和转换器:

public class StringToVisibilityConvertor : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value.ToString() != "HideMe")
            return Visibility.Visible;
        return Visibility.Collapsed;
    }

如何在wpf c#中通过编程隐藏数据网格的单元格

由于动态列,我无法使绑定工作。最后,我偶然发现了Paul Stovell写的一篇很棒的文章,介绍了如何使用列索引作为绑定路径创建网格。之后,我为所有列创建了一个数据模板,并使用datatrigger隐藏了单元格:

http://paulstovell.com/blog/dynamic-datagrid

必须承认,我从来没有在调整自动生成列方面走得这么远——我很少使用自动生成的列,尽管我猜您必须使用,因为您在运行时才知道这些列。

如果是我,我会这样调整模板:

<DataTemplate x:Key="DataTemplate5">
    <Button Name="Button1" Click="ButtonClick" Background="Orange" Content="{Binding ???}" >
    <DataTemplate.Triggers>
        <DataTrigger Binding="{Binding ???}" Value="HideMe">
            <Setter Property="Visibility" Value="Collapsed"/>
        </DataTrigger>
    </DataTemplate.Triggers>
</DataTemplate>

省去了对转换器的需要。现在的问题是,该放什么?

您可能还需要在后面的代码中添加一些:

                 DataGridTemplateColumn templateColumn = new DataGridTemplateColumn    //create new template column
                 {
                     Header = origHeader,
                     CellTemplate = (DataTemplate)Resources["DataTemplate5"],
                     SortMemberPath = e.Column.SortMemberPath
                 };  

实际上,先尝试一下——这可能就足够了,再调试一下您的值转换器。