c# -如何在没有绑定源的情况下在DataGridView中搜索和筛选
本文关键字:情况下 DataGridView 搜索 筛选 绑定 | 更新日期: 2023-09-27 18:06:24
我想在 c# 和SQLite中搜索数据网格视图,但我没有绑定源用于Datagridview。我用以下代码填充Datagridview:
SQLiteConnection conn = new SQLiteConnection("Data Source=gasstation.sqlite;Version=3");
dt = new DataTable();
SQLiteCommand cmd = new SQLiteCommand("SELECT ID,fname, lname, nationalCode," +
personalCode, phone ,address, datetime(dateEnter) as dateEnter FROM Workers", conn);
conn.Open();
SQLiteDataAdapter da = new SQLiteDataAdapter(cmd);
da.Fill(dt);
SQLiteDataReader read = cmd.ExecuteReader();
DateTime date;
PersianCalendar pc = new PersianCalendar();
while (read.Read())
{
date = read.GetDateTime(7);
string datePC = string.Format("{0}/{1}/{2}", pc.GetYear(date),
pc.GetMonth(date), pc.GetDayOfMonth(date));
dgvUsers.Rows.Add(new object[] {
read.GetValue(0),
read.GetValue(1),
read.GetValue(2),
read.GetValue(3),
read.GetValue(4),
read.GetValue(5),
read.GetValue(6),
datePC });
}
read.Close();
conn.Close();
}
如何利用文本框的文本变化事件对数据网格视图进行搜索和过滤。
我在StackOverflow中看到了所有的问答,但它没有正确回答我的问题。
你的代码有点混乱。
首先用DataAdapter
填充所有数据到DataTable
中,这看起来很好。但是然后你再读一次在DataReader
中并将它们填充到代码中的DataGridView
中。
这是不必要的。忘记阅读器和它所在的循环吧!
如果DataTable
包含数据,则可以将DGV
绑定到该表:
dgvUsers.DataSource = dt;
当直接绑定时,你不能排序或过滤。因此,最好创建一个BindingSource
,并使其成为DGV的DataSource
:
BindingSource bs = new BindingSource(dt, "");
注意第二个参数:它是空的,因为我们使用一个表作为BindingSource
的数据源。如果我们用的是DataSet
,我们就会把TableName
放在那里。你没有设置TableName
属性;最好这样做,所以让我们将实例化更改为dt = new DataTable("someTableName");
BindingSource
:
将DGV
绑定到数据上dgvUsers.DataSource = bs;
最后我们可以根据需要设置Sort
和Filter
属性。
我们可以从其他控件强制转换回BindingSource
,也许像这样:
private void textBox_lastName_TextChanged(object sender, EventArgs e)
{
BindingSource bs = dgvUsers.DataSource as BindingSource;
if (textBox_lastName.Text == "") bs.RemoveFilter();
else bs.Filter = "lname like '%" + textBox_lastName.Text + "%'";
}
我注意到在循环中创建了一个格式化的日期字段。我怀疑这是创造这种循环的首要原因…?但你也可以把它添加到DataTable
;当然,最好的方法是,像往常一样,选择你想要的值,让DBMS做所有的工作。
但是如果你想做一些你不相信SQL函数实现的特殊事情,比如使用PersianCalendar
类,你可以在你的SELECT
:中添加一个虚拟字段:
SQLiteCommand cmd = new SQLiteCommand("SELECT ID,fname, lname ,nationalCode, " +
"personalCode, phone, address, datetime(dateEnter) as dateEnter " +
"'"'" as pcDate FROM Workers", conn);
. .在填满表格后,用特殊值填充虚拟字段:
DateTime date;
PersianCalendar pc = new PersianCalendar();
foreach(DataRow row in dt.Rows)
{
date = row.Field<DateTime>("dateEnter");
string datePC = string.Format("{0}/{1}/{2}",
pc.GetYear(date), pc.GetMonth(date), pc.GetDayOfMonth(date));
row.SetField<string>("pcDate", datePC);
}
当然你现在可能想要隐藏dateEnter
列从DVG:
dgvUsers.Columns["dateEnter"].Visible = false;