通过多个条件过滤WPF DataGrid

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

我想实现Excel之类的过滤器,将数据网格分为三列。

这是我的代码:

    using System.Data.Odbc;
    using System.Windows;
    using System.Data;

    namespace DB_inspector
    {
        /// <summary>
        /// Interaction logic for MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();

            }

            private void Button_Click(object sender, RoutedEventArgs e)
            {
                OdbcConnection dbConnection = new OdbcConnection("Driver={Pervasive ODBC Client Interface};ServerName=875;dbq=@DBFS;Uid=Username;Pwd=Password;");
                string strSql = "select NRO,NAME,NAMEA,NAMEB,ADDRESS,POSTA,POSTN,POSTADR,COMPANYN,COUNTRY,ID,ACTIVE from COMPANY";
                dbConnection.Open();
                OdbcDataAdapter dadapter = new OdbcDataAdapter();
                dadapter.SelectCommand = new OdbcCommand(strSql, dbConnection);
                DataTable table = new DataTable("COMPANY");
                dadapter.Fill(table);
                DataGrid1.DataContext = table;
                DataGrid1.ItemsSource = table.DefaultView;
                dadapter.Update(table);
                dbConnection.Close();
            }

        private void TextBox_TextChanged(object sender, System.Windows.Controls.TextChangedEventArgs e)
        {
            DataView dv = DataGrid1.ItemsSource as DataView;

            string filter = NameSearch.Text;
                if (string.IsNullOrEmpty(filter))
                    dv.RowFilter = null;
                else
                    dv.RowFilter = string.Format("NAME Like '%{0}%'", filter);

        }

        private void TextBox_TextChanged_1(object sender, System.Windows.Controls.TextChangedEventArgs e)
        {
            DataView dv = DataGrid1.ItemsSource as DataView;

            string filter = ActiveSearch.Text;
            if (string.IsNullOrEmpty(filter))
                dv.RowFilter = null;
            else
                dv.RowFilter = string.Format("ACTIVE Like '%{0}%'", filter);
        }

        private void CustomerNumberSearch_TextChanged(object sender, System.Windows.Controls.TextChangedEventArgs e)
        {
            DataView dv = DataGrid1.ItemsSource as DataView;

            string filter = CustomerNumberSearch.Text;
            if (string.IsNullOrEmpty(filter))
                dv.RowFilter = null;
            else
                dv.RowFilter = string.Format("NRO Like '%{0}%'", filter); //this should be "Begins with" not "Like"
        }
    }
}

我想为NROACTIVE列实现过滤器,以便在装载数据期间,NRO列中的数字将仅以3开头,而在ACTIVE列中的值将仅为1。 ACTIVE中有值1和0(1有效,0不活跃)。

我当前的设置仅按一个条件过滤。如何使所有这三个标准正确运行?

c# wpf datagrid odbc
1个回答
0
投票

您可以修改数据库查询,并让数据库更有效地完成工作。但是,如果您仍然喜欢使用C#进行操作,则可以使用LINQ来过滤DataTable

MainWindow.xaml

<Window>
  <Window.DataContext>
    <ViewModel />
  </Window.DataContext>

  <DataGrid ItemsSource={Binding Data} />
</Window>

ViewModel.cs

public class ViewModel
{
  public DataTable Data { get; set; }

  public ViewModel()
  {
    this.Data = new DataTable();
  }

  // Button ICommand handler
  private void ExecuteGetDataCommand(object param)
  {
    DataTable dataTable = QueryDatabase(); 

    // Filter DataTable using LINQ
    this.Data = dataTable
      .AsEnumerable()
      .Where(row => row["NRO"].ToString().StartsWith("3")
        && row["ACTIVE"].ToString().StartsWith("1"))
      .CopyToDataTable();
  }

  private DataTable QueryDatabase()
  {
    OdbcConnection dbConnection = new OdbcConnection("Driver={Pervasive ODBC Client Interface};ServerName=875;dbq=@DBFS;Uid=Username;Pwd=Password;");
    string strSql = "select NRO,NAME,NAMEA,NAMEB,ADDRESS,POSTA,POSTN,POSTADR,COMPANYN,COUNTRY,ID,ACTIVE from COMPANY";
    dbConnection.Open();
    OdbcDataAdapter dadapter = new OdbcDataAdapter();
    dadapter.SelectCommand = new OdbcCommand(strSql, dbConnection);
    DataTable table = new DataTable("COMPANY");
    dadapter.Fill(table);
    return table;
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.