2016-10-05 36 views
0

私はWPFアプリケーションを構築しています。私はDataGridがExcelのやり方とよく似た列を非表示にしたいと思っています。私はオプションとして '列を隠す'とポップアップする右クリックメニューを持っています。ここではそれがどのように動作するかです:WPF DataGridヘッダを選択したセルとして扱うには?

 if (dgfinal_Copy.CurrentCell.Column == null) 
     { 

     } 

     else 
     { 

      int columnIndex = dgfinal_Copy.CurrentCell.Column.DisplayIndex; 
      dgfinal_Copy.Columns[columnIndex].Visibility = Visibility.Collapsed; 
     } 

私は誰かがグリッドにクリックする前に、ヘッダーをクリックした場合、現在のセルがNULLになるので、if文を追加する必要がありました。また、[2]列のセルをクリックしてから、[0]のヘッダーをクリックしてから、メニューから[hide column]をクリックすると、[2]が非表示になり[0]になります。

これは、ヘッダーの列インデックス(カーソルがある場合)を使用し、現在のセルの列インデックスを使用しない場合は変更したいと考えています。

 private void WorkItemsGrid_Hide(object sender, RoutedEventArgs e) 
    { 

    if (dgfinal_Copy.CurrentCell.Column == null) 
    { 

    } 

    else 
    { 


     int colIn = dgfinal_Copy.SelectedCells[0].Column.DisplayIndex; 
     System.Windows.MessageBox.Show(colIn.ToString()); 

     int columnIndex = dgfinal_Copy.CurrentCell.Column.DisplayIndex; 
     dgfinal_Copy.Columns[columnIndex].Visibility = Visibility.Collapsed; 
    } 

} 

        <MenuItem Header="Unhide All Columns" Click="WorkItemsGrid_UnHide" /> 

答えて

1

私の基本コードと協力して、以下:

は、私は簡単に何かを見下ろすてるかどうかを確認するために使用している完全なメソッドを追加しています。それは、クリックされた列ヘッダーの列インデックスを返します。あなたはあなたの正確なニーズにそれを適応させることができるはずです。

XAML:背後に

<DataGrid Name="dtgrdNotes" MouseRightButtonUp="DataGrid_Click"> 
    <DataGrid.ContextMenu> 
     <ContextMenu MenuItem.Click="menuItem_Click"> 
      <MenuItem Name="hide" Header="Hide"/> 
     </ContextMenu> 
    </DataGrid.ContextMenu> 
</DataGrid> 

コード:

DependencyObject mainDep = new DependencyObject(); 

private void DataGrid_Click(object sender, RoutedEventArgs e) 
{ 
    DependencyObject dep = (DependencyObject)e.OriginalSource; 

    while ((dep != null) && !(dep is DataGridCell) && !(dep is DataGridColumnHeader)) 
    { 
     dep = VisualTreeHelper.GetParent(dep); 
    } 

    mainDep = dep; 
} 

private void menuItem_Click(object sender, RoutedEventArgs e) 
{ 
    DependencyObject dep = mainDep; 

    int index = -1; 

    if (dep is DataGridColumnHeader) 
    { 
     DataGridColumnHeader header = dep as DataGridColumnHeader; 
     index = header.DisplayIndex; 
     dtgrdNotes.Columns[index].Visibility = Visibility.Collapsed; 
    } 

    if (dep is DataGridCell) 
    { 
     DataGridCell cell = dep as DataGridCell; 
     index = cell.Column.DisplayIndex; 
     dtgrdNotes.Columns[index].Visibility = Visibility.Collapsed; 
    } 
    label.Content = index; 
} 

これは、セルと列ヘッダをクリックし、両方のために働く必要があります。

+0

動作しません。問題は、選択されたセルがないことです。ヘッダーのみが選択されます。そして、その時点で選択されているヘッダーの列インデックスが必要です。 – user3486773

+0

@ user3486773私の編集した回答を確認してください – Hank

+0

@ user3486773それは今のところうまくいきましたか? – Hank

関連する問題