WPF-右键单击显示/隐藏选定列



我想在WPF上为我的DataGrid制作Show和Hide控件。我只想添加2个按钮(用上下文菜单或其他什么(,但我不知道该怎么做。

我只想从我的DataGrid中选择一列,当我点击"隐藏"按钮时,它就会被隐藏。当我点击"显示"按钮,它将再次显示。你能帮我吗?非常感谢。

这是我的DataGrid代码;

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;

首先,如果列被隐藏,我真的不确定如何右键单击它来再次显示它。

除此之外,你可以在ContextStripMenu中尝试这样的东西,但我不在电脑上,所以我不能确定它是否有效:

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

这是为您的事件处理程序准备的:

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

您可以执行类似的操作

注意:这远非完美,但您将了解如何解决问题

如果你有什么困难,请告诉我,我会尽力帮助

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

最新更新