在从SQLite数据库获取数据的WPF中,向DataGrid的自动生成ColumnHeader添加控件
我需要为从SQLite数据库导入的数据创建一个类似excel的过滤器 从数据库导入和显示数据在在从SQLite数据库获取数据的WPF中,向DataGrid的自动生成ColumnHeader添加控件,wpf,sqlite,datagrid,Wpf,Sqlite,Datagrid,我需要为从SQLite数据库导入的数据创建一个类似excel的过滤器 从数据库导入和显示数据在 private void UpdateDataGrid(SQLiteConnection con, string sql) { DataSet dataSet = new DataSet(); SQLiteDataAdapter dataAdapter = new SQLiteDataAdapter(sql, con); dataAdapter.Fill(dataSet);
private void UpdateDataGrid(SQLiteConnection con, string sql)
{
DataSet dataSet = new DataSet();
SQLiteDataAdapter dataAdapter = new SQLiteDataAdapter(sql, con);
dataAdapter.Fill(dataSet);
dgMaterials.ItemsSource = dataSet.Tables[0].DefaultView;
}
AutoGenerateColumns是真的,因此我得到如下结果:
数据显示在左侧数据网格中。
在右侧列表框中,我使用
private void dg_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
lb.Items.Add(e.Column.Header.ToString());
}
正如我所说,我想在每个标题文本旁边的标题行中创建类似excel的过滤器按钮,如下所示
<DataGrid x:Name="dgMaterials"
IsReadOnly="True"
CanUserReorderColumns="False"
CanUserResizeColumns="False"
CanUserSortColumns="False"
DockPanel.Dock="Left" AutoGeneratingColumn="dg_AutoGeneratingColumn"
AlternatingRowBackground="LightGray">
... input a button next to every header text ...
</DataGrid>
在XAML网站上,我是这样开始的
<DataGrid x:Name="dgMaterials"
IsReadOnly="True"
CanUserReorderColumns="False"
CanUserResizeColumns="False"
CanUserSortColumns="False"
DockPanel.Dock="Left" AutoGeneratingColumn="dg_AutoGeneratingColumn"
AlternatingRowBackground="LightGray">
... input a button next to every header text ...
</DataGrid>
谢谢@mm8
最后一个问题:
没有为第一列标题创建按钮,我不知道为什么:
想法?您可以在
自动生成列
事件处理程序中将列的标题
属性设置为面板
:
dgMaterials.AutoGeneratingColumn += (ss, ee) =>
{
StackPanel stackPanel = new StackPanel() { Orientation = Orientation.Horizontal };
stackPanel.Children.Add(new TextBlock() { Text = ee.PropertyName, VerticalAlignment = VerticalAlignment.Center });
stackPanel.Children.Add(new Button() { Content = "..." });
ee.Column.Header = stackPanel;
};
在xaml中编辑ColumnHeaderStyle
<Style x:Key="DataGridColumnHeaderStyle1" TargetType="{x:Type DataGridColumnHeader}">
<Setter Property="VerticalContentAlignment" Value="Center"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGridColumnHeader}">
<Grid>
<Themes:DataGridHeaderBorder BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" IsClickable="{TemplateBinding CanUserSort}" IsPressed="{TemplateBinding IsPressed}" IsHovered="{TemplateBinding IsMouseOver}" Padding="{TemplateBinding Padding}" SortDirection="{TemplateBinding SortDirection}" SeparatorBrush="{TemplateBinding SeparatorBrush}" SeparatorVisibility="{TemplateBinding SeparatorVisibility}">
<StackPanel Orientation="Horizontal">
<ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
<Button Content="..." Margin="2" Click="Button_Click"/>
</StackPanel>
</Themes:DataGridHeaderBorder>
<Thumb x:Name="PART_LeftHeaderGripper" HorizontalAlignment="Left" Style="{StaticResource ColumnHeaderGripperStyle}"/>
<Thumb x:Name="PART_RightHeaderGripper" HorizontalAlignment="Right" Style="{StaticResource ColumnHeaderGripperStyle}"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
...
<DataGrid ColumnHeaderStyle="{DynamicResource DataGridColumnHeaderStyle1}"/>
你指的是什么
HeaderText
?可能有多行,但只有一个列标题。那么你想从哪里获取标题中的文本?@mm8我不想引用自动生成的标题文本。这就是我的问题:我从哪里获得标题文本?或者说我需要它?我只需要在每个标题文本旁边添加一个按钮。这看起来不错。谢谢你。但我还有两个挑战:1。如何为创建的按钮注册单击事件?2.没有为第一列标题创建按钮,我不知道为什么:/@Udineska:1。就像为任何其他按钮注册事件处理程序一样:按钮。单击+=…
。2.您是否在XAML中定义了其他列?请发布您的第一列当前的图像。@Udineska:您是否尝试增加第一列的宽度?如果在自动生成列中放置断点,它会被命中多少次?每个专栏都应该有一个,我做到了。增加宽度显示的是相同的。如果设置断点,它将跳过第一列。不知道为什么…@Udineska:如果你没有点击第一列的断点,这意味着它不是自动生成的,也就是说,你正在自己添加它。出现错误:没有定义namespaceprefix“Themes”。WPF项目中不支持“DataGridHeaderOrder”。