我有一个datagridview和一个文本框。当用户在文本框中输入一些字母时,我希望对datagridview进行排序,并将结果显示为文本框的文本。但是如果用户不在文本框中键入任何内容或删除文本框中的内容,我希望datagridview显示我的数据库的所有结果。实际上,我在两周前取得了成功,但我已经做了一些改变,现在它已经不再适用了。
这是我的代码:
private void textBox1_TextChanged(object sender, EventArgs e)
{
SqlConnection maConnexion = new SqlConnection("Server= localhost; Database= Seica_Takaya;Integrated Security = SSPI; ");
maConnexion.Open();
string Var1 = textBox1.Text;
SqlCommand command = maConnexion.CreateCommand();
SqlCommand command1 = maConnexion.CreateCommand();
if (Program.UserType == "admin")
{
if (textBox1.Text != String.Empty)
{
command.Parameters.AddWithValue("@SerialNum", Var1 + "%");
command1.Parameters.AddWithValue("@SerialNum", Var1 + "%");
command.CommandText = "SELECT Message, FComponent, ReadValue, ValueReference, FaultCodeByOp, RepairingTime FROM FailAndPass WHERE SerialNum LIKE @SerialNum AND FComponent IS NOT NULL";
command1.CommandText = "SELECT Machine, BoardName, BoardNumber FROM FailAndPass WHERE SerialNum LIKE @SerialNum And FComponent IS NOT NULL";
}
}
else
{
if (textBox1.Text != String.Empty)
{
command.Parameters.AddWithValue("@SerialNum", Var1 + "%");
command1.Parameters.AddWithValue("@SerialNum", Var1 + "%");
command.CommandText = "SELECT Message, FComponent, ReadValue, ValueReference, FaultCodeByOp, RepairingTime FROM FailAndPass WHERE (SerialNum LIKE @SerialNum) AND ReportingOperator IS NULL AND FComponent IS NOT NULL ";
command1.CommandText = "SELECT DISTINCT SerialNum, Machine, BoardName, BoardNumber FROM FailAndPass WHERE ReportingOperator IS NULL AND FComponent IS NOT NULL AND (SerialNum LIKE @SerialNum) ";
}
}
if (!string.IsNullOrWhiteSpace(textBox1.Text))
{
SqlDataAdapter sda = new SqlDataAdapter(command);
SqlDataAdapter sda1 = new SqlDataAdapter(command1);
DataTable dt = new DataTable();
DataTable dt1 = new DataTable();
sda.Fill(dt);
sda1.Fill(dt1);
DataColumn dcIsDirty = new DataColumn("IsDirty", typeof(bool));
DataColumn dcIsDirty1 = new DataColumn("IsDirty", typeof(bool));
dcIsDirty.DefaultValue = false;
dcIsDirty1.DefaultValue = false;
dt.Columns.Add(dcIsDirty);
dt1.Columns.Add(dcIsDirty1);
dataGridView1.DataSource = dt;
dataGridView2.DataSource = dt1;
maConnexion.Close();
dataGridView1.Columns[6].Visible = false;
dataGridView2.Columns[3].Visible = false;
}
}
正如您将看到的,datagridview已填充,用户可以编辑列,因此可以通过单击按钮在数据库中写入新数据。但是如果用户在文本框中写了一个serialNum,它只显示一个结果..而不是所有的结果都以B0033开头为例。
答案 0 :(得分:0)
如评论中所述,每次文本更改时都不希望重新查询。我写了一些代码来帮助你入门。您必须将其转换为应用程序的代码。
// Put this to the event or sub where you want to query for data
Private DataGridView dgv;
Private DataView _tblView;
private void Form1_Load(object sender, EventArgs e) {
DataTable tbl = myModule.GetDataTableWithRows();
// Imagine we have Columns "CutomerID", "CustomerLastName", "CustomerPriority"
_tblView = new DataView(tbl);
_tblView.RowFilter = "";
dgv.DataSource = _tblView;
}
然后你的TextChangedEvent
private void txtChanged(object sender, EventArgs e) {
_tblView.RowFilter = ("CustomerLastName like \'" + (mytextBox.Text + "\'"));
}
这样您的应用程序就会进行过滤。
对于rowfilter也有通配符,我认为%
对任何char都有任何数量的字符。有关更多信息,请查看DataView MSDN