Справка по событиям C # MDI

У меня есть форма, которая представляет собой контейнер MDI. В этой форме я создаю 6 дочерних форм, каждая с меткой:

for (int i = 0; i < 6; i++)
{
    Form window = new Form();
    window.Width = 100;
    window.Height = 100;

    window.MdiParent = this;
    window.FormBorderStyle = FormBorderStyle.FixedToolWindow;

    Label label = new Label();
    label.AutoSize = true;
    label.Location = new System.Drawing.Point(1, 1);
    label.Size = new System.Drawing.Size(35, 13);
    label.TabIndex = 1;
    label.Name = "label" + i.ToString();
    label.Text = window.Top.ToString();

    window.LocationChanged += new System.EventHandler(HERE);

    window.Controls.Add(label);
    window.Show();              
}

Я добавил событие в месте, измененном на окно. Как сделать так, чтобы метка обновлялась в соответствии с положением окон?


person Ozzy    schedule 31.05.2009    source источник


Ответы (2)


Я думаю, что эта строка поможет вам:

window.LocationChanged += new EventHandler(delegate(object o, EventArgs evtArgs) { 
    label.Text = window.Location.ToString(); 
});
person Fredrik Mörk    schedule 31.05.2009

Что ж, проще всего это сделать с помощью лямбда-выражения или анонимного метода:

window.LocationChanged += (sender, args) => label.Text = window.Top.ToString();

Если вы используете C # 1.1, вам придется действовать немного сложнее из-за того, что метка автоматически захватывается в C # 2+ - вам придется создать новый класс, подобный этому:

internal class LocationChangeNotifier
{
    private readonly Label label;

    internal LocationChangeNotifier(Label label)
    {
        this.label = label;
    }

    internal void HandleLocationUpdate(object sender, EventArgs e)
    {
        label.Text = ((Control) sender).Top.ToString();
    }
}

затем используйте его как:

LocationChangeNotifier notifier = new LocationChangeNotifier(label);
window.LocationChanged += new EventHandler(notifier.HandleLocationUpdate);

Разве захваченные переменные не хороши? :)

person Jon Skeet    schedule 31.05.2009
comment
И решение Джона всегда имеет этот дополнительный штрих элегантности (кроме window.Top, не возвращающего позицию ...); o) - person Fredrik Mörk; 31.05.2009
comment
Я предполагал, что нужен только топ, учитывая исходную стоимость. Было бы странно перейти от простого отображения верхнего значения к отображению полного местоположения. Я согласен, что вопрос не ясен :) - person Jon Skeet; 31.05.2009
comment
Правда, я действительно пропустил это в исходном образце кода; интерпретируемое положение в тексте для местоположения в моем коде; Я буду винить то, что иногда слишком быстро читаю, а английский не является моим родным языком ... - person Fredrik Mörk; 01.06.2009