- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个函数可以遍历 Datagridview 并找到与提供的搜索查询的任何匹配项。它使用找到的“点击”在 datagridview 的右侧绘制一个面板,显示点击相对于滚动条的位置。
当我在按钮单击事件中运行此代码时,它按预期工作。当我在文本更改事件中运行它时,代码按预期运行,然后面板自行清除。
这只会在每个调试 session 第一次运行代码时发生。 session 的其余部分,文本更改事件工作正常,面板保留其应有的绘制部分。
最初,出于开发目的,我将代码直接放在按钮事件处理程序中。只有当我在文本更改事件中放置相同的代码时,我才第一次看到这个问题。
我已经将代码放入其自己的函数中,在按钮单击和文本更改事件中调用它。
所以看起来像这样:
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 显示当我在一个简单的按钮点击中运行搜索时会发生什么:
Panel Paint on Button Click event
您会注意到,我点击了按钮,面板保留了它的颜色。
如果我将相同的代码放入 TextChanged 事件处理程序中,会发生以下情况:
Panel Paint on TextChanged event
它在搜索到 3 个字符之前不会进行搜索,因此您会看到,一旦我输入“U”,它就会运行搜索、绘制面板,但随后会立即将其清除。所有其他搜索,例如当我添加“E”或退格回“U”时都可以正常工作。
最佳答案
当您以这种方式创建 Graphics 对象时:
Graphics g = panelPaint.CreateGraphics();
您使用此对象绘制的内容不会持久存在。控件每次重绘(无效)时都会生成一个新的 Graphics 对象。这种情况经常发生。这意味着每次控件失效时都需要使用 Paint
事件的 PaintEventArgs 提供的当前 Graphics 对象刷新绘图。 . (您会经常在 MSDN 文档和 StackOverflow 中的许多问题中找到此建议)。
因此,您始终在 Paint
处理程序(或重写的 OnPaint 方法)中执行所有绘制。
不同的事件可能会导致控件失效(重绘):当窗体被最小化/最大化时,当另一个对象/窗口移动到它上面时,当系统广播设置更改消息(和其他)时等等其他条件。
还有当表单的 AutoValidate功能触发它:
Gets or sets a value that indicates whether controls in this container will be automatically validated when the focus changes.
尝试修改代码如下。请注意,我无法测试此代码,因为我没有此处使用的对象和某些值。我希望这可以帮助你调整你的代码。
private void Search() {
_hits.Clear();
tbTotal.Visible = false;
if (tbSearch.Text.Length < 3) return;
Searchy(tbSearch.Text);
if (_hits.Count == 0) return;
foreach (var hit in _hits) {
dgvEvents.Rows[hit.RowNum].Cells[2].Style = new DataGridViewCellStyle {
BackColor = hit.color == Color.Empty ? ext.myColor : hit.color,
ForeColor = invert(BackColor)
};
}
panelPaint.Invalidate();
extrabuttons(true);
tbTotal.Text = allhits().Count.ToString();
}
private void panelPaint_Paint(object sender, PaintEventArgs e)
{
if (_hits.Count == 0) return;
e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
foreach (var hit in _hits) {
PaintPanel(hit, e.Graphics);
}
}
private void PaintPanel(Hit hit, Graphics g)
{
using (Pen myPen = new Pen(hit.color == Color.Empty ? ext.myColor : hit.color, 1)) {
float percent = ((float)hit.RowNum / dgvEvents.Rows.Count) * (float)panelPaint.Height;
g.DrawLine(myPen, 1, percent, panelPaint.Width, percent);
}
}
关于c# - 为什么我在 TextChanged 事件中运行相同的代码而不是在 Button Click 中得到不同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56840824/
最近有人问我是否可以在 Excel VBA 中制作一个宏,允许用户输入两个数字并让它自动放到下一行。这样做的目的是让他们可以一次输入两个数字的测试成绩,而无需按回车键,因为他们不擅长打字。 当我第一次
我在 Windows Phone 上的应用程序中有三个 TextBox。我想在用户在其中任何一个中插入输入后立即更改这三个 TextBox 的数值。 我的 xaml 看起来像这样: 我在 C#
我有 CalendarExtender 并将其绑定(bind)到文本框,但是当我在 textchanged 事件中编写代码时发现它没有触发;这里是我的代码片段: 代码隐藏: protected vo
我在做一个项目。我有文本框,通过 TextChanged 事件我将文本更改为大写 txt.ToUpper(); 然后 selectionStart 从头开始。我将其更改为 textbox.text
我仍然是 Android 开发的新手,我想做的是创建一个监听器,它将包含两个 TextView 对象,它们分别保存面积和周长。宽度和高度是 EditText 对象。输入宽度和高度后,应根据 calcA
我有一个文本框,它有一个相当庞大的 _TextChanged 事件处理程序。在正常打字条件下,性能还可以,但当用户执行长时间的连续操作时,性能会明显滞后,例如按住退格键一次删除大量文本。 例如,事件用
在尝试做一些更复杂的事情时,我遇到了一种我不太了解的行为。 假设下面的代码处理 textChanged 事件。 private void textChanged(object sender, Tex
我正在关注 M-V-VM我的 WPF UI 的模式。我想将文本框的 TextChanged 事件的命令连接到我的 ViewModel 类中的命令。我能想到的完成此任务的唯一方法是从 TextBox 控
我有一个简单的 aspx 文件 这是 test4.aspx.vb 代码文件 Partial Class test4 Inhe
我正在使用绑定(bind)到对象的基本文本框。基本上,我想要做的是每次编辑框中的文本并且用户取消选择框或编辑底层绑定(bind)数据时调用一个方法。我现在使用的是 TextChanged 事件,但这有
我的 TabControl 页面中有一个 RichTextBox。请注意,RichTextBox 是使用以下代码以编程方式创建的: TabPage addedTabPage = new TabPage
这是我的第一个问题。我接受过非常基本的 Java 培训,现在正在 Android Studio 中开发一个简单的应用程序。该应用程序是一个温度转换器,它读取一个文本字段,并在应用一种方法后,它实时在另
我有一个 TextChanged我的事件 ComboBox喜欢; private void comboBox1_TextChanged(object sender, EventArgs e) {
我仍在学习 C#,如果这是一个愚蠢的问题,请原谅我,也请原谅我的长篇文章,因为我不确定如何说这个,而不是“长”的方式。 我的场景: 我正在使用 DockPanel Suite对于我的应用程序,我有一个
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
我刚开始使用 C# 和 Visual Studio,但遇到了问题。 我正在尝试使用 TextChanged 事件计算三个不同乘法的总值,因此每次我在用于乘法的文本框中输入数字时,总文本框都会更新。 t
所以我想做的是能够连续输入所有 10 个文本框。我从第一个开始,然后在输入 3 个字符后将焦点移至下一个,并在输入 3 个字符后将焦点移至下一个。 我已经完成了那部分,但是如果第二个文本框中已经有文本
我想知道是否有可能制作KeyDown TextChanged 之前的事件触发? 我为一个简单的 TextBox 添加了这两个事件现在我想检查是否 Delete键被按下。如果是, , 如果没有 .我创
我目前正在处理一个项目,但出于某种原因,我的文本框的 textchanged 事件没有触发。我试图在我的代码中放置一个断点,但他没有到达那里,所以他的事件没有触发 imo。
我在 xml 中制作了一个不可见的按钮,我想在我的 EditText 中创建某个字符串值时再次使按钮可见。当使用 if 语句满足值时,我使用了 TextWatcher 检查。然而,当显示按钮的代码被执
我是一名优秀的程序员,十分优秀!