【发布时间】:2021-04-10 06:00:58
【问题描述】:
好吧,我知道这听起来很奇怪,但老实说,我确实记得在 c# 中用计时器解决了一个示例,在该示例中我设置了计时器的最小值、最大值、刻度、间隔等......但我不记得/不要不知道该怎么做,MVS 2019 不会显示这些参数。
任何帮助将不胜感激。
我正在尝试根据第 7 个索引的值开始一行之后 datagridview (dg) 已从数据库中完全加载,但它无法正常工作,或者某些行没有已加载或已加载但 O 复杂度非常低(程序响应非常糟糕)。
private void Dg_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
OleDbConnection con = GetConnection();
OleDbCommand cmd = new OleDbCommand("SELECT * FROM Items", con);
try
{
OleDbDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
string PartName = reader.GetValue(0).ToString();
string SN = reader.GetValue(1).ToString();
string ModNum = reader.GetValue(2).ToString();
string TS = reader.GetValue(3).ToString();
string Man = reader.GetValue(4).ToString();
string Brand = reader.GetValue(5).ToString();
string Price = reader.GetValue(6).ToString();
string Quan = reader.GetValue(7).ToString();
string IPP = reader.GetValue(8).ToString();
string HeadMat = reader.GetValue(9).ToString();
string Descibtion = reader.GetValue(10).ToString();
string MinQuan = reader.GetValue(11).ToString();
string MaxQuan = reader.GetValue(12).ToString();
string PricePI = reader.GetValue(13).ToString();
string ExpiryDate = reader.GetValue(14).ToString();
string USDRate = reader.GetValue(15).ToString();
}
reader.Close();
con.Close();
}
catch (OleDbException ex)
{
MessageBox.Show(ex.Message.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
if (GetConnection().State == ConnectionState.Closed)
{
timer1.Start();
Thread thread = new Thread(Blink);
thread.Start();
timer1.Stop();
}
}
没有这段代码,程序运行得很好,没有任何问题
这是处理行颜色变化和闪烁的 Blink 方法。
private void Blink(object o)
{
if (dg.Rows.Count != 0)
{
while (dg.Rows.Count >= 0 && go)
{
foreach (DataGridViewRow row in dg.Rows)
{
int value = int.Parse(row.Cells[7].Value.ToString());
if (value == 0 || value == 1)
{
row.DefaultCellStyle.BackColor = Color.Red;
}
else if (value > 1 || value < 4)
{
row.DefaultCellStyle.BackColor = Color.Yellow;
}
else
row.DefaultCellStyle.BackColor = Color.Green;
}
go = true;
Thread.Sleep(100);
while (dg.Rows.Count != 0 && !go)
{
foreach (DataGridViewRow row in dg.Rows)
{
int value1 = int.Parse(row.Cells[7].Value.ToString());
if (value1 == 0 || value1 == 1)
{
row.DefaultCellStyle.BackColor = Color.White;
}
else if (value1 > 1 || value1 < 4)
{
row.DefaultCellStyle.BackColor = Color.White;
}
else
row.DefaultCellStyle.BackColor = Color.White;
}
go = false;
Thread.Sleep(1000);
}
}
}
}
【问题讨论】:
-
你能解释一下这段代码的目的是什么吗?您正在将数据从数据库获取到阅读器并通过阅读器循环,但对数据不做任何事情。为什么需要那个代码?
-
我正在从数据库中填充一个 datagridview 并更改每行的背景颜色,如果第 7 个索引上的值,验证过程必须仅在 datagridview 完全填充时开始,我让它工作到目前为止,但我无法对数据做任何事情,我的意思是出售、复制、删除编辑...
-
我认为您需要先阅读有关如何在 gridview 中加载数据的信息...此外,您共享的 Dg_CellPainting 代码除了检索数据和通过阅读器循环之外没有任何作用。
-
哦,让我编辑我的帖子。我忘记了眨眼方法...等一下请检查我的帖子
-
不要将该代码放在
CellPainting事件中。该事件经常被触发。考虑到代码在做什么……看到性能拖累并不奇怪。另外,代码应该做什么?while (reader.Read()) …循环中的代码什么也不做。该代码的目的是什么?另外,Blink方法中的代码看起来很奇怪……if (value > 1 || value < 4)?这看起来很奇怪。您确定不想使用 && 代替 || 吗?代码让Thread进入睡眠状态?你到底想用这段代码做什么?您需要重新考虑这一点。
标签: c# mysql sql datagridview