gpt4 book ai didi

C# - 如何在不使用 BindingSource 的情况下在 DataGridView 中搜索和筛选

转载 作者:行者123 更新时间:2023-12-02 01:14:32 27 4
gpt4 key购买 nike

我想在C#SQLite中对数据 GridView 进行搜索,但我没有绑定(bind)源 用于 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();
}

如何使用文本框的文本更改事件在数据 GridView 上进行搜索和过滤。

我在 StackOverflow 中看到了所有问题和解答,但它没有正确回答我的问题。

最佳答案

你的代码有点困惑。

首先使用DataAdapter将所有数据填充到DataTable中,看起来不错。但是然后您在DataReader再次读取它们,并将它们填充到代码中的DataGridView中。

这是没有必要的。忘记阅读器和它所在的循环!

如果DataTable 包含数据,您可以将DGV 绑定(bind)到该表:

dgvUsers.DataSource = dt;

但是,直接绑定(bind)时,您无法排序或过滤。因此,最好创建一个 BindingSource 并将其设为 DGV 的 DataSource:

BindingSource bs = new BindingSource(dt, "");

注意第二个参数:它是空的,因为我们使用单个表作为 BindingSource 的数据源。如果我们使用DataSet,我们就会将TableName放在那里。您尚未设置 TableName 属性;这样做更好,所以让我们将实例化更改为 dt = new DataTable("someTableName");

现在我们可以通过 BindingSourceDGV 绑定(bind)到数据:

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 类,则可以添加一个 虚拟 字段您的选择:

   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);
}

当然,您现在可能想要隐藏 DVG 中的 dateEnter 列:

dgvUsers.Columns["dateEnter"].Visible = false;

关于C# - 如何在不使用 BindingSource 的情况下在 DataGridView 中搜索和筛选,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39425125/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com