在从SQLite数据库获取数据的WPF中,向DataGrid的自动生成ColumnHeader添加控件

在从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);

我需要为从SQLite数据库导入的数据创建一个类似excel的过滤器

从数据库导入和显示数据在

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”。