Обновление метки в основной форме из пользовательского контроля - PullRequest
0 голосов
/ 03 апреля 2012

В моем текущем приложении у меня есть main form: frmMain с statusstrip и label: lblStatus внутри.Я хотел бы обновить этот ярлык из своих пользовательских элементов управления, которые я добавляю в основную форму, когда нажимаю соответствующую кнопку:

ucBeheer ucBeheer = new ucBeheer();
splitContainer1.Panel2.Controls.Add(ucBeheer);

Изнутри моего usercontrol, когда я выполняю действие, я бынравится обновлять lblStatus.Я попытался добавить следующее свойство в мою основную форму:

    public string updateStatus
    {
        get { return lblStatus.Text; }
        set { lblStatus.Text = value; }
    }

И затем получить доступ к методу, как этот в моем пользовательском элементе управления:

        frmMain mainForm = new frmMain();
        mainForm.updateStatus = "This is a test";

Но это не работает, язнаете, что это потому, что я делаю новый объект из моего frmMain, но я не знаю, как решить это иначе?

Я также нашел следующим образом , сEvent Handler, но я не могу этого сделать, потому что мой пользовательский элемент управления на самом деле еще не находится в моей mainForm, пока я не добавлю его туда нажатием кнопки, поэтому у меня нет ссылки на него.

Итак, у меня немного идей, я надеюсь, что кто-нибудь сможет мне помочь.Спасибо, Томас

Редактировать: Итак, мне удалось сделать это следующим образом:

        frmMain owningForm = (frmMain)this.Parent.Parent.Parent.Parent;
        owningForm.updateStatus = "This is a test";

но this.Parent.Parent.Parent.Parent... на самом деле не кажется мне хорошим кодированием, есть ли другой способполучить самый верхний родитель?

Ответы [ 3 ]

5 голосов
/ 03 апреля 2012

Вы можете добавить свойство, подобное этому, в свой usercontrol, с этим вы можете получить доступ к frmMain, в котором находится usercontrol.

public frmMain MainForm
{
    get
    {
        var parent = Parent;
        while (parent != null && (parent as frmMain) == null)
        {
            parent = parent.Parent;
        }
        return parent as frmMain;
    }
} 

UPDATE: Если вы просто хотите получить верхнюю частьДля большинства родителей вы можете использовать что-то вроде этого:

public Control TopMostParent
{
    get
    {
        var parent = Parent;
        while (parent.Parent != null)
        {
            parent = parent.Parent;
        }
        return parent;
    }
} 

Или даже сделать метод расширения этого:

public static Control TopMostParent(this Control control)
{
    var parent = control.Parent;
    while (parent.Parent != null)
    {
        parent = parent.Parent;
    }
    return parent;
} 
1 голос
/ 03 апреля 2012

Ваш контроль и форма должны общаться, поэтому один должен "знать" о другом.В реальном выражении это означает предоставление ссылки на одно, на другое.Таким образом, у вас есть 2 варианта: либо элементу управления нужна ссылка на форму, либо форме нужна ссылка на элемент управления.

Я бы сделал так, чтобы форма подписалась на событие, опубликованноеконтроль.Эта форма дает ссылку только на один из его методов для элемента управления.

class StatusChangedEventArgs : EventArgs
{
    public string Text { get; set; }
}

partial class MyControl : UserControl
{
    public event EventHandler<StatusChangedEventArgs> StatusChanged = delegate { };

    public void RaiseStatusChanged( string message )
    {
        StatusChanged( this, new StatusChangedEventArgs { Text = "message" } );
    }
}

Затем в вашей форме подпишитесь на событие:

...
ucBeheer ucBeheer = new ucBeheer();
ucBeheer.StatusChanged += HandleStatusChanged;
splitContainer1.Panel2.Controls.Add(ucBeheer);
...

partial class MyForm : Form
{
    void HandleStatusChanged( object sender, StatusChangedEventArgs args )
    {
        lblStatus.Text = args.Text;
    }
}
0 голосов
/ 28 апреля 2014

Вы можете ссылаться на основную форму вашего приложения, используя FormCollection Application.OpenForms по имени:

frmMain owningForm = (frmMain) Application.OpenForms ["frmMain"];

owningForm.updateStatus =«Это тест»;

...