Один "О нет, это не правильно", часто в форме сканирование таблицы . Сканирования таблицы не используют специальных индексов и могут способствовать чистке каждого полезного в кэшах памяти. В postgreSQL, например, Вы найдете, что он похож на это.
Seq Scan on my_table (cost=0.00..15558.92 rows=620092 width=78)
Иногда сканирования таблицы идеальны законченный, скажем, использование индекса для запросов строк. Однако это - один из тех шаблонов красного флага, которые Вы, кажется, ищете.
imho здесь немного двоичная ситуация: и нет "однострочного". единственное решение, которое я вижу, - поместить элементы управления, которые не реализуют события, в контейнер .NET, который выполняет.
Когда какой-либо элемент управления получает щелчок, нормальное ожидаемое поведение состоит в том, что он станет активным элементом управления формы (к которому всегда можно получить доступ с помощью this.ActivceControl).
Но, в частности, если элемент управления, который вы щелкнули, захватывает мышь, что-то должно вызвать событие, поскольку .NET не реализует «всплытие» события (как это делает WPF).
Обычный способ справиться с расширением поведения любого запечатанного объекта или чего-то еще - написать метод расширения, и я обнаружил, что писать расширения для Control довольно легко, но я не знаю, поможет ли это вам в этом кейс. К сожалению, я сейчас за пределами моей родной страны, и у меня нет Visual Studio, с которой можно было бы поиграть.
Одна стратегия, которую вы можете использовать, чтобы определить, попадает ли данная точка в форме в границы любого элемента управления, - это перечислить области (границы) всех элементов управления в форме через 'forall Forms Control.Collection (this.Controls). Но если у вас есть перекрывающиеся элементы управления, тогда возникает проблема с несколькими элементами управления, которые могут содержать данную точку.
лучше всего, Билл
попробуйте следующее:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
AddMouseMoveHandler(this);
}
private void AddMouseMoveHandler(Control c)
{
c.MouseMove += MouseMoveHandler;
if(c.Controls.Count>0)
{
foreach (Control ct in c.Controls)
AddMouseMoveHandler(ct);
}
}
private void MouseMoveHandler(object sender, MouseEventArgs e)
{
lblXY.Text = string.Format("X: {0}, Y:{1}", e.X, e.Y);
}
}
Почему бы вам просто не использовать обработчики событий наведения указателя мыши элементов управления?