C# 定时器最小值、最大值和C中的值#
好吧,我知道这听起来很奇怪,但说实话,我确实记得我在c#中解决了一个计时器的例子,在这里我设置了计时器的minvalue、maxvalue、tick、interval等等。。。但我不记得/不知道如何再次这样做,MVS 2019不会显示这样的参数 任何帮助都将不胜感激 在datagridview(dg)从数据库中完全加载后,我试图基于第7个索引的值启动一行,但是,它工作不正常,要么某些行未加载,要么已加载,但O复杂性非常低(程序响应非常差) 没有这段代码,程序运行得很好,没有任何问题 下面是处理行颜色变化和闪烁的闪烁方法C# 定时器最小值、最大值和C中的值#,c#,mysql,sql,datagridview,C#,Mysql,Sql,Datagridview,好吧,我知道这听起来很奇怪,但说实话,我确实记得我在c#中解决了一个计时器的例子,在这里我设置了计时器的minvalue、maxvalue、tick、interval等等。。。但我不记得/不知道如何再次这样做,MVS 2019不会显示这样的参数 任何帮助都将不胜感激 在datagridview(dg)从数据库中完全加载后,我试图基于第7个索引的值启动一行,但是,它工作不正常,要么某些行未加载,要么已加载,但O复杂性非常低(程序响应非常差) 没有这段代码,程序运行得很好,没有任何问题 下面是处理行
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);
}
}
}
}
private void闪烁(对象o)
{
如果(dg.Rows.Count!=0)
{
而(dg.Rows.Count>=0&&go)
{
foreach(dg.Rows中的DataGridViewRow行)
{
int value=int.Parse(row.Cells[7].value.ToString());
如果(值==0 | |值==1)
{
row.DefaultCellStyle.BackColor=Color.Red;
}
否则如果(值>1 | |值<4)
{
row.DefaultCellStyle.BackColor=Color.Yellow;
}
其他的
row.DefaultCellStyle.BackColor=Color.Green;
}
去=真;
睡眠(100);
while(dg.Rows.Count!=0&&!go)
{
foreach(dg.Rows中的DataGridViewRow行)
{
int value1=int.Parse(row.Cells[7].Value.ToString());
如果(值1==0 | |值1==1)
{
row.DefaultCellStyle.BackColor=颜色.白色;
}
否则如果(值1>1 | |值1<4)
{
row.DefaultCellStyle.BackColor=颜色.白色;
}
其他的
row.DefaultCellStyle.BackColor=颜色.白色;
}
go=假;
睡眠(1000);
}
}
}
}
我不想劝阻您这样做,但是,如果您能让我放纵一下,因为我很难理解“为什么”,您可能希望行在短时间内“闪烁”。这对我来说似乎很奇怪,如下所述
我对“眨眼的”一行有点怀疑。我不知道这是怎么回事
“闪烁”行5秒“有助于”用户考虑
最后,行颜色将更改为特定颜色。我个人
认为“眨眼”是分心/烦人的,没有任何作用。
当然,当数据加载到时,可能有“几”行“闪烁”
指出这些行有问题。但即便如此,也很容易做到
想象一下,用户在那一刻移开视线,错过了“闪烁”
行以及低于可见网格大小的行呢?
“眨眼”这些行毫无意义。所以,我不明白“什么
“目的”此“闪烁”行用于什么?我想这会让你
如果在用户纠正错误之前“闪烁”从未停止,则更有意义
有问题的数据
话虽如此,我建议您更仔细地了解一下您目前拥有的代码。这种代码方法可能很好地工作,但是在我的测试中,我相信UI会表现得很慢,响应也会很慢。例如,如果在任一方向上滚动栅格,您将注意到显示是多么缓慢、跳跃,并且不像预期的那样平滑。此外,如果您编辑一个单元格并按“回车”键,您将注意到一个延迟…需要一两秒钟才能下拉到下一个单元格
这主要是因为Blink
代码是从网格的CellPainting
事件执行的。网格的CellPainting
事件经常被触发。当所有单元格均未更改时,它将启动。例如,如果用户“滚动”网格。因此,闪烁
代码将不必要地运行,因为没有单元格发生更改。换句话说,当行已经是正确的颜色时,Blink
方法可以运行并更改行的背面颜色。这是造成经济停滞的原因。代码运行Blink
方法的次数比需要的次数多得多
您可能会说…“我在另一个线程下运行Blink
方法。”…使用
Thread thread = new Thread(Blink);
thread.Start();
您可能是对的……然而,这实际上“制造”了更多与UI迟钝相关的问题。如果你退一步看看这个,你应该问问自己……“我需要多少线程?”…这段代码实际上是在“创建”成百上千的线程,
只使用一次,从不处理它们
例如,假设数据有三(3)列和二十(20)行。将数据加载到网格中时,网格的CellPainting
事件将至少触发六十(60)次(每个单元格一次)。(我相信它实际上会触发更多的线程),但是,即使是60次,这也意味着代码至少会创建60个“独立”线程,这些线程永远不会被处理。尽管如此,崩盘并不令人惊讶
如果代码在某个地方正确地处理了线程,您可能会稍微缓解这种情况,但是,在代码当前状态下,这是不可能的,因为线程
已“创建”、已启动,并且从未在同一if
语句中处理。一旦退出if
语句,变量thread
将超出范围(未正确处理)
当然,一次
Thread thread = new Thread(Blink);
thread.Start();
private void SetRowColor(DataGridViewRow row, bool white) {
if (row.IsNewRow) {
return;
}
if (white) {
row.DefaultCellStyle.BackColor = Color.White;
}
else {
if (int.TryParse(row.Cells["TargetColumn"].Value.ToString(), out int value)) {
switch (value) {
case 0:
case 1:
row.DefaultCellStyle.BackColor = Color.Red;
break;
case 2:
case 3:
row.DefaultCellStyle.BackColor = Color.Yellow;
break;
default:
row.DefaultCellStyle.BackColor = Color.LightGreen;
break;
}
}
}
}
private void Blink() {
if (ColorOn) {
foreach (DataGridViewRow row in dg.Rows) {
SetRowColor(row, false);
}
}
else {
foreach (DataGridViewRow row in dg.Rows) {
SetRowColor(row, true);
}
}
}
private void MilliSecondTimer_Tick(object sender, EventArgs e) {
Blink();
ColorOn = !ColorOn;
}
private void FiveSecondTimer_Tick(object sender, EventArgs e) {
MilliSecondTimer.Stop();
FiveSecondTimer.Stop();
ColorOn = true;
Blink();
}
private void StartTimers() {
FiveSecondTimer.Interval = 5000;
MilliSecondTimer.Interval = 500;
FiveSecondTimer.Tick += new EventHandler(FiveSecondTimer_Tick);
MilliSecondTimer.Tick += new EventHandler(MillSecondTimer_Tick);
MilliSecondTimer.Start();
FiveSecondTimer.Start();
}
private DataTable GetDT() {
DataTable dt = new DataTable();
dt.Columns.Add("Col0", typeof(string));
dt.Columns.Add("TargetColumn", typeof(int));
dt.Columns.Add("Col2", typeof(string));
Random rand = new Random();
for (int i = 0; i < 30; i++) {
dt.Rows.Add("COR" + i, rand.Next(0, 7), "C2R" + i);
}
return dt;
}
DataTable GridDT;
bool ColorOn = true;
System.Windows.Forms.Timer FiveSecondTimer = new System.Windows.Forms.Timer();
System.Windows.Forms.Timer MilliSecondTimer = new System.Windows.Forms.Timer();
private void Form1_Load(object sender, EventArgs e) {
GridDT = GetDT();
dg.DataSource = GridDT;
StartTimers();
}
private void dg_CellValueChanged(object sender, DataGridViewCellEventArgs e) {
if (dg.Columns[e.ColumnIndex].Name == "TargetColumn") {
if (dg.Rows[e.RowIndex].Cells["TargetColumn"].Value != null) {
SetRowColor(dg.Rows[e.RowIndex], false);
}
}
}