Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 需要在C中使用Textbox实现对我的WPF数据网格的过滤器#_C#_Filter_Datagrid - Fatal编程技术网

C# 需要在C中使用Textbox实现对我的WPF数据网格的过滤器#

C# 需要在C中使用Textbox实现对我的WPF数据网格的过滤器#,c#,filter,datagrid,C#,Filter,Datagrid,我有一个WPF数据网格,其中我使用itemsource从datatable填充数据。现在我想为我的Datagrid或应用textbox过滤器(如果可能,将过滤器应用于列标题)。我是WPF的新手,所以请任何人帮我解决这个问题 注意:我没有使用MVVM,我只是使用简单的WPF数据网格 Currently my code is like below: XAML Code: ------------------- <Page.Resources> <LinearGr

我有一个WPF数据网格,其中我使用itemsource从datatable填充数据。现在我想为我的Datagrid或应用textbox过滤器(如果可能,将过滤器应用于列标题)。我是WPF的新手,所以请任何人帮我解决这个问题

注意:我没有使用MVVM,我只是使用简单的WPF数据网格

Currently my code is like below:
XAML Code:
-------------------

 <Page.Resources>
        <LinearGradientBrush x:Key="HeaderBrush" StartPoint="0.5,0" EndPoint="0.5,1">
            <GradientStop Color="#FF6B6EB9" Offset="0"/>
            <GradientStop Color="#FF6B6EB9" Offset="1"/>
            <GradientStop Color="#FF6B6EB9" Offset="0.509"/>
            <GradientStop Color="#FF6B6EB9" Offset="0.542"/>
            <GradientStop Color="#FF6B6EB9" Offset="0.542"/>
            <GradientStop Color="#FF9699DC" Offset="0.904"/>
        </LinearGradientBrush>

        <LinearGradientBrush x:Key="HeaderBorderBrush" StartPoint="0.5,0" EndPoint="0.5,1">
            <GradientStop Color="#FF1060D1" Offset="0.614"/>
            <GradientStop Color="#FF316BD5" Offset="0.853"/>
            <GradientStop Color="#FFBBD3ED" Offset="1"/>
        </LinearGradientBrush>

        <Style x:Key="HeaderStyle" TargetType="DataGridColumnHeader">
            <Setter Property="Background" Value="{StaticResource HeaderBrush}" />
            <Setter Property="Foreground" Value="White" />
            <Setter Property="BorderBrush" Value="{StaticResource HeaderBorderBrush}" />
            <Setter Property="BorderThickness" Value="0" />
            <Setter Property="SnapsToDevicePixels" Value="True" />
            <Setter Property="HorizontalContentAlignment" Value="Left" />
            <Setter Property="MinWidth" Value="0" />
            <Setter Property="MinHeight" Value="30" />
            <Setter Property="Cursor" Value="Hand" />
        </Style>
    </Page.Resources>

    <Grid>
        <DataGrid Name="dgExcel"  LoadingRow="dgExcel_LoadingRow" RowEditEnding="dgExcel_RowEditEnding" ColumnHeaderStyle="{StaticResource HeaderStyle}" CanUserDeleteRows="True" AutoGenerateColumns="True" AutoGeneratingColumn="dgExcel_AutoGeneratingColumn" ItemsSource = "{Binding}" ColumnWidth="Auto"  SelectionChanged="dgExcel_SelectionChanged" CanUserAddRows="True"  Loaded="dgExcel_Loaded" CellEditEnding="dgExcel_CellEditEnding" ScrollViewer.CanContentScroll="True" ScrollViewer.HorizontalScrollBarVisibility="Auto" ScrollViewer.VerticalScrollBarVisibility="Auto" GridLinesVisibility="Horizontal" AlternatingRowBackground="#FFF3F3F3">
        </DataGrid>
    </Grid>
 

首先,添加一个文本框。你可以找到带有按钮的漂亮文本框来清除文本,或者主动点击按钮进行搜索,但现在,只需一个简单的按钮。确保已命名,并添加
TextChanged
事件处理程序

<TextBox x:Name="searchBox" TextChanged="SearchTextBox_TextChanged"/>
这假定已在代码隐藏或视图模型中设置了一个
可观测集合

public ObservableCollection<Orders> OrderCollection { get; } = //collection of orders
警告:这不会处理粘贴的文本。这有一套单独的活动

刷新视图时,它将通过集合视图的
过滤器运行
ItemsSource
的各个项目。然后设置是否接受每个项目

private void CollectionViewSource_Filter(object sender, FilterEventArgs e)
{
    if (e.Item is DataRow row)
    {
        if (searchBox.HasText)
        {
            e.Accepted = Filter(row, searchBox.Text);
        }
        else
        {
            e.Accepted = true;
        }
    }
    else
    {
        e.Accepted = false;
    }
}

private bool Filter(DataRow row, string filterText)
{
    // check if row matches the filterText
    // check whichever columns of the row are appropriate
    return true;
}
有不同的方法可以把这些东西连接在一起,但这应该包括基本的必需品。我没有检查您的数据所期望的数据类型是否是通过事件处理程序传递的实际数据类型,因此请务必仔细检查

public ObservableCollection<Orders> OrderCollection { get; } = //collection of orders
private void SearchTextBox_TextChanged(object sender, TextChangedEventArgs e)
{
    RefreshView();
}

void RefreshView()
{
    var viewSource = (CollectionViewSource)Resources["collectionView"];
    viewSource?.View?.Refresh();
}
private void CollectionViewSource_Filter(object sender, FilterEventArgs e)
{
    if (e.Item is DataRow row)
    {
        if (searchBox.HasText)
        {
            e.Accepted = Filter(row, searchBox.Text);
        }
        else
        {
            e.Accepted = true;
        }
    }
    else
    {
        e.Accepted = false;
    }
}

private bool Filter(DataRow row, string filterText)
{
    // check if row matches the filterText
    // check whichever columns of the row are appropriate
    return true;
}