1

I want to make Show and Hide control for my DataGrid on WPF. I just want to add 2 button (with ContextMenu or something) but i don't know how can i do it.

I just want to select a column from my DataGrid and when i click "Hide" button, it will be hide. When i click "Show" button and it will be show again. Can you help me for this? Thank you.

This is my DataGrid Code;

gridview1.CanUserDeleteRows = false;
        gridview1.IsReadOnly = true;
        SQLiteConnection baglanti = new SQLiteConnection("Data Source=db/veritabani.s3db");
        baglanti.Open();
        string komut = "SELECT * FROM belgeler";
        SQLiteDataAdapter da = new SQLiteDataAdapter(komut, baglanti);
        DataTable dt = new DataTable();
        da.Fill(dt);
        gridview1.ItemsSource = dt.DefaultView;
MythDev
  • 11
  • 1
  • Possible duplicate of [Binding Visibility for DataGridColumn in WPF](https://stackoverflow.com/questions/22073740/binding-visibility-for-datagridcolumn-in-wpf) – Dean Kuga Dec 05 '18 at 18:13

2 Answers2

0

First of all I'm not really sure how you could right click a column to show it again if it's hidden.

Apart from that you could try something like this for your ContextStripMenu but I'm away from my PC so I can't be sure it works:

private void dataGridView1_MouseClick(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Right)
    {
        ContextMenu contextMenu = new ContextMenu();
        contextMenu.MenuItems.Add(new MenuItem("Hide"));
        contextMenu.MenuItems.Add(new MenuItem("Show"));
        contextMenu.ItemClicked += new ToolStripItemClickedEventHandler(contexMenu_ItemClicked);
        contextMenu.Show(dataGridView1, new Point(e.X, e.Y));

    }
}

And this for your event handler:

void contexMenu_ItemClicked(object sender, ToolStripItemClickedEventArgs e) 
{
    int mouseOverColumn = dataGridView1.HitTest(e.X,e.Y).ColumnIndex;
    dataGridView1.Columns[mouseOverColumn].Visible = false;
}
nicktheone
  • 77
  • 2
  • 10
0

You could do something like this

Note: This is far from perfect, but you will get an idea of how you can solve your problem

If you struggle with something let me know, i try to help then

<DataGrid x:Name="dataGrid">
    <DataGrid.Resources>
        <local:VisibilityToBooleanConverter x:Key="VisibilityToBooleanConverter"></local:VisibilityToBooleanConverter>
        <local:BindingProxy x:Key="BindingProxy" Data="{Binding ElementName=dataGrid, Path=Columns}"></local:BindingProxy>
    </DataGrid.Resources>
    <DataGrid.ColumnHeaderStyle>
        <Style TargetType="{x:Type DataGridColumnHeader}">
            <Setter Property="ContextMenu">
                <Setter.Value>
                    <ContextMenu ItemsSource="{Binding Source={StaticResource BindingProxy}, Path=Data}">
                        <ContextMenu.ItemContainerStyle>
                            <Style TargetType="{x:Type MenuItem}">
                                <Setter Property="IsCheckable" Value="True"/>
                                <Setter Property="IsChecked" Value="{Binding Visibility,Converter={StaticResource VisibilityToBooleanConverter}}"/>
                                <Setter Property="Header" Value="{Binding Header}"/>
                            </Style>
                        </ContextMenu.ItemContainerStyle>
                    </ContextMenu>
                </Setter.Value>
            </Setter>
        </Style>
    </DataGrid.ColumnHeaderStyle>
    ...
</DataGrid>
public class VisibilityToBooleanConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value is Visibility visibility)
        {
            return visibility == Visibility.Visible;
        }
        return false;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value is bool boolValue)
        {
            return (boolValue) ? Visibility.Visible : Visibility.Hidden;
        }
        return Visibility.Hidden;
    }
}
nosale
  • 808
  • 6
  • 14