2

WPFアプリケーションを開発していますdatagrid。アプリケーションに、データグリッドのitemsourceをIEnumerableコレクションに割り当てながら、データグリッドの列ヘッダーを非表示および再表示するためのコンテキストメニューを作成しました。

 this.dataGrid1.ItemsSource = objref.Result;


                grid_data = objref.Result;
                cxMenu = new ContextMenu();

                foreach (Microsoft.Windows.Controls.DataGridColumn item in dataGrid1.Columns)
                {
                    menuItem = new MenuItem();
                    menuItem.Header = item.Header;
                    menuItem.IsChecked = true;
                    cxMenu.Items.Add(menuItem);
                    menuItem.Click += new RoutedEventHandler(menuItem_Click);
                    menuItem.Checked += new RoutedEventHandler(menuItem_Checked);
                    menuItem.Unchecked += new RoutedEventHandler(menuItem_Unchecked);
                }

Everythjingは正常に動作しています。チェックを外すと列は正常に削除されますが、もう一度チェックするMenuItemContextMenu追加されません。

私のチェックイベントのハンドラーは次のとおりです。

 void menuItem_Checked(object sender, RoutedEventArgs e)
    {
        MenuItem item = sender as MenuItem;
        dataGrid1.ItemsSource = null;
        dataGrid1.ItemsSource = objref.Result;// Again assgining the whole set to itemssource
        List<string> menuList = new List<string>();
        menuList.Clear();



    foreach (MenuItem menuItem in cxMenu.Items)
    {
        if (menuItem.IsChecked == false)
        {
            menuList.Add(menuItem.Header.ToString());
        }
    }

        Functionsclass objref = new Functionsclass();


        foreach (string menuItem in menuList)
        {
            foreach (Microsoft.Windows.Controls.DataGridColumn column in dataGrid1.Columns)
            {
                if (column.Header.ToString() == menuItem)
                {
                    dataGrid1.Columns.Remove(column);
                    break;
                }
            }
        }
    }

しかし、もう一度確認しても列が追加されません。これについて私を助けてください。

アップデート2:

 void menuItem_Click(object sender, RoutedEventArgs e)
    {
        MenuItem item = sender as MenuItem;
        if (item.IsChecked)
        {
            item.IsChecked = false;
        }
        else
        {
            item.IsChecked = true;
        }
    }

    void menuItem_Unchecked(object sender, RoutedEventArgs e)
    {
        MenuItem item = sender as MenuItem;
        foreach (Microsoft.Windows.Controls.DataGridColumn column in dataGrid1.Columns)
        {
            if (column.Header.ToString().Contains(item.Header.ToString()))
            {
                dataGrid1.Columns.Remove(column);
                break;
            }
        }
    }

ハンドラーのチェックを外します。

4

2 に答える 2

2

列を非表示/表示したいだけの場合、列の削除/追加は正しいアプローチではないと思います。Visibilityカラムのプロパティを利用することをお勧めします。Visibility.Collapsed非表示に設定してから、Visibility.Visible再度表示するように設定します。

column.Visibility = Visibility.Collapsed; // Column is hidden

column.Visibility = Visibility.Visible; //Column is Visible
于 2013-01-23T10:32:26.100 に答える
1

チェックされたイベントハンドラーとチェックされていないイベントハンドラーを次のように変更しました。今では正常に動作しています..:)

//Unchecked handler

 void menuItem_Unchecked(object sender, RoutedEventArgs e)
    {
        MenuItem item = sender as MenuItem;
        foreach (Microsoft.Windows.Controls.DataGridColumn column in dataGrid1.Columns)
        {
           if (column.Header.ToString().Contains(item.Header.ToString()))
            {
               column.Visibility = Visibility.Collapsed;
                break;
            }


        }
    }

//チェックされたハンドラー

    void menuItem_Checked(object sender, RoutedEventArgs e)
    {
        MenuItem item = sender as MenuItem;

        List<string> menuList = new List<string>();
        menuList.Clear();
         foreach (Microsoft.Windows.Controls.DataGridColumn column in dataGrid1.Columns)
        {
           if (column.Header.ToString().Contains(item.Header.ToString()))
            {
               column.Visibility = Visibility.Visible;
                break;
            }


        }

    }
于 2013-01-23T11:02:05.257 に答える