簡體   English   中英

如何在WPF C#中以編程方式隱藏DataGrid的單元格?

[英]How to programmatically hide cells of a DataGrid in wpf c#?

有什么方法可以在代碼隱藏中隱藏/折疊特定的dataGrid單元格嗎? 由於我的數據表列是在運行時創建的,因此我無法指定屬性(在XAML中)以正確設置這些數據觸發器,模板選擇器等。但是,我能夠通過循環查找要折疊的確切單元格數據表以將行/列索引添加到列表(如下)。

我知道這是非正統的,但是我已經讀了數周的線程來嘗試解決這個問題,但是沒有任何東西可以幫助我。 這似乎是最簡單的解決方案(如果可能)。

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;
}

編輯:數據模板和轉換器信息

我目前正在通過自動生成列來構建數據網格。 我知道所有其他列的名稱,因此可以縮小到動態生成的列。 我的動態列是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.    
    }
}

但是由於我沒有要綁定的屬性(列)名稱,因此我無法正確綁定它。 這是我通過datatemplate和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;
    }

由於存在動態列,因此無法使綁定生效。 最后,我偶然發現了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>

節省了轉換器的需求。 現在的問題是,該放置什么? 不要嘗試-即{Binding}。

您可能還需要在代碼后面添加一些內容:

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

實際上,首先嘗試一下-可能就足夠了,並在值轉換器中進行一些調試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM