【发布时间】:2019-07-01 18:38:51
【问题描述】:
我有一个函数可以遍历 Datagridview 并找到与提供的搜索查询匹配的任何内容。 它使用它找到的“命中”在 datagridview 的右侧绘制一个面板,显示命中相对于滚动条的位置。
当我在按钮单击事件中运行此代码时,它按预期工作。 当我在文本更改事件中运行它时,代码按预期运行,然后面板自行清除。
这仅在每个调试会话第一次运行代码时发生。会话的其余部分,文本更改事件工作正常,面板保留了它应该绘制的部分。
最初,出于开发目的,我将代码直接放在按钮事件处理程序中。只有当我在文本更改事件中放置相同的代码时,我才第一次看到这个问题。
我已经将代码放入它自己的函数中,在按钮单击和文本更改事件中调用它。
所以它看起来像这样:
private void btnSearch_Click(object sender, EventArgs e)
{
Search();
}
private void TbSearch_TextChanged(object sender, EventArgs e)
{
Search();
}
“搜索”包含:
private void Search()
{
PanelClear();
if (tbSearch.Text.Length > 2)
{
Searchy(tbSearch.Text);
if (_hits.Count > 0)
{
foreach (var hit in _hits){PanelPaint_paint(hit);}
}
}
}
PanelClear 包含:
private void PanelClear()
{
//Clears the list of matches.
_hits.Clear();
//Invalidates my panel control.
panelPaint.Invalidate();
//Hides a textbox
tbTotal.Visible = false;
}
还有PanelPaint_paint:
private void PanelPaint_paint(Hit hit)
{
Graphics g = panelPaint.CreateGraphics();
Color xx = ext.myColor;
Color saved = hit.color;
if (saved != Color.Empty) xx = hit.color;
Pen myPen = new Pen(xx) { Width = 1 };
int dgvl = dgvEvents.Rows.Count;
int pnll = panelPaint.Height;
int hitl = hit.RowNum;
double percent = ((double)hitl / (double)dgvl) * pnll;
float x = (float)percent;
g.DrawLine(myPen, 1, x, panelPaint.Width, x);
dgvEvents.Rows[hit.RowNum].Cells[2].Style = new DataGridViewCellStyle
{
BackColor = xx,
ForeColor = invert(xx)
};
extrabuttons(true);
tbTotal.Text = allhits().Count.ToString();
}
所以这里有一个 gif,显示了当我在一个简单的 Button Click 中运行搜索时会发生什么:
Panel Paint on Button Click event
你会注意到,我点击了按钮,面板保留了它的颜色。
如果我将相同的代码放入 TextChanged 事件处理程序会发生以下情况:
Panel Paint on TextChanged event
它在达到 3 个字符之前不会搜索,所以你会看到,一旦我输入“U”,它就会运行搜索,绘制面板,然后立即清除它。所有其他搜索,例如当我添加“E”或退格回到“U”时都可以正常工作。
【问题讨论】:
-
PanelPaint_paint()是有趣的部分。 -
我不能说为什么它的工作方式不同。但是有一个简单的规则 - only 在需要绘画的控件的
Paint事件中进行绘画并且不会有副作用/奇怪的行为。 -
@myaccountname Jimi 要求您复制
PanelPaint_paint()方法的源代码并将其粘贴到您的问题中。您可以编辑问题以添加更多文本。 -
@Jimi 已添加!我是新手,想尽可能地隐藏我的意大利面……如果有不清楚的地方告诉我。
-
@myaccountname 这就像咨询医生。不要尴尬。他的情况更糟。