我想实现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"
}
}
}
我想为NRO
和ACTIVE
列实现过滤器,以便在装载数据期间,NRO
列中的数字将仅以3开头,而在ACTIVE
列中的值将仅为1。 ACTIVE
中有值1和0(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;
}
}