首页 > 解决方案 > 将控件添加到 WPF 中从 SQLite 数据库获取数据的 DataGrid 的自动生成的 ColumnHeader

问题描述

我需要为从 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

在此处输入图像描述

在 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>

标题中按钮的自动创建适用于:

private void dg_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
    ////string headertext = e.Column.Header.ToString();

    //StackPanel sp = new StackPanel();
    //TextBlock tb = new TextBlock();
    //tb.Text = e.Column.Header.ToString();
    //sp.Children.Add(tb);

    dgMaterials.AutoGeneratingColumn += (ss, ee) =>
    {
        Button b = new Button() { Content = "...", Name = "btn_" + ee.PropertyName };
        b.Click += HeaderFilterButtonClick;
        StackPanel stackPanel = new StackPanel() { Orientation = Orientation.Horizontal };
        stackPanel.Children.Add(new TextBlock() { Text = ee.PropertyName, VerticalAlignment = VerticalAlignment.Center });
        //stackPanel.Children.Add(new Button() { Content = "...", Name = "btn_" + ee.PropertyName });
        stackPanel.Children.Add(b);
        ee.Column.Header = stackPanel;
    };

    lb.Items.Add(e.Column.Header.ToString());
}

谢谢@mm8

最后一个问题:

没有为第一列标题创建按钮,我不知道为什么:

在此处输入图像描述

想法?

标签: wpfsqlitedatagrid

解决方案


您可以在事件处理程序Header中将列的属性设置为 a :PanelAutoGeneratingColumn

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

推荐阅读