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中看到了所有的问答,但它没有正确回答我的问题。

c# -如何在没有绑定源的情况下在DataGridView中搜索和筛选

你的代码有点混乱。

首先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;

最后我们可以根据需要设置SortFilter属性。

我们可以从其他控件强制转换回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;