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

问题描述 投票:0回答:1

我需要为我从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为true,这样我就得到了这样的东西。

enter image description here

数据显示在左侧的数据网格中,在右侧的列表框中,我收集生成的列头,用

private void dg_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
    lb.Items.Add(e.Column.Header.ToString());
}

就像我说的,我想在页眉行的每一个页眉文字旁边创建类似excel的过滤按钮,就像这样。

enter image description here

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

在Headers中自动创建按钮,可以使用。

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

最后一个问题。

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

enter image description here

有什么想法?

wpf sqlite datagrid
1个回答
1
投票

你可以设置 Header 列的属性为 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;
};

0
投票

在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}"/>
private void Button_Click(object sender, RoutedEventArgs e)
{
    //what you want to do on the filter click
}
© www.soinside.com 2019 - 2024. All rights reserved.