2016-09-18 30 views
0

特定のdataGridセルをコードビハインドで隠す/折りたたむ方法はありますか?私のデータテーブルの列は実行時に作成されるので、これらのデータトリガー、テンプレートセレクタなどを正しく設定するためのプロパティ(XAML内)を指定することはできません。 私はループで折りたたみたい正確なセルを見つけることができます行/列インデックスをリスト(下)に追加するためのデータテーブルを介して。wpf C#でDataGridのセルをプログラムで非表示にするにはどうすればよいですか?

私はこれが正統ではないことを知っていますが、私はこれを解決しようと何週間もスレッドを読んできましたが、何も私をそこに入れてくれませんでした。これは、(可能であれば)最も簡単な解決策のようです。

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の&コンバータ情報

私は現在autogeneratingcolumnsでデータグリッドを構築しています。私は他のすべての列の名前を知っているので、動的に生成される列に絞り込むことができます。私の動的な列は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; 
    } 
+0

ただ明確にしようとしている - あなたは右、全体の列を非表示の話をしていますか?あなたの質問はそれを言いますが、あなたは説明が個々の細胞について話しているようです。あなたが細胞を話しているなら、細胞が隠されているときに何が起こることを期待していますか? 列について話している場合は、DataColumnの表示をCollapsedに設定してみましたか? –

+0

申し訳ありませんタイトルを編集しました。つまり、列全体ではなく特定のセルを非表示にすることです。 – ctalley5

+0

私のデータテーブルは、たくさんのリンク列で構成されています。私のデータグリッドは、それらをリンクを開くボタンとして表示します。多くのセルにはnull値がありますが、それでもボタンとして表示され、データの悪い表現です。それらのセルを空白にして、リンクを開くセルのボタンのみを表示する必要があります。 – ctalley5

答えて

3

動的な列のため、バインディングを使用できませんでした。最後に、私はPaul Stovellの偉大な記事に、バインディングパスとして列インデックスを使用してグリッドを作成する方法を見つけました。これを実行した後、私はすべての列のためのDataTemplateを作成し、datatriggerで細胞を隠し:

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

0

は、私は、列の自動生成を微調整するには、この行き過ぎたことはありません、認めなければなりません - 私はめったに自動生成カラムを使用していませんが、実行時までカラムがわからない場合は、私はそうしなければなりません。

それは私だったら、私はこのようにテンプレートを微調整したい:

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

実は、それが最初に試す - それはあなたの価値コンバータ内のいくつかのデバッグとともに、十分かもしれません。

+0

ありがとうIan。私はあなたの助言に従い、変換器を取り除いた。残念ながら、バインディングが機能しないままでした。この方法には欠点がありますが、私は必要なものを手に入れた回答を投稿しました。 – ctalley5

+0

あなたはそれがうまくいっていると思います。将来の参考のためにもう少し詳しく説明しなければ、あなたの答えを答えにすることができます。 –

+0

絶対に。私は答え(上記)をマークし、記事のハイパーリンクを提供しました。 – ctalley5

関連する問題