У меня есть функция, которая просматривает 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();
}
Итак, вот рисунок, показывающий, что происходит, когда я запускаю поиск простым нажатием кнопки:
Панель Paint on Button Click событие
Вы заметите, я нажимаю кнопку, и панель сохраняет свою краску.
Вот что произойдет, если я помещу этот же код в обработчик событий TextChanged:
Панель Paint на событии TextChanged
Он не выполняет поиск, пока не наберет 3 символа, поэтому вы увидите, как только я введу «U», он запустит поиск, раскрасит панель, но затем сразу очистит ее. Все другие поиски, например, когда я добавляю «E» или возвращаем назад на «U», работают нормально.