Обновление элементов формы из классов, которые не имеют к ним доступа - PullRequest
0 голосов
/ 19 сентября 2010

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

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.IO;
using System.Collections;

namespace MyApp {
    public partial class MyApp : Form
    {
        public MyApp()
        {
            InitializeComponent();

            // Code
        }

        public void updateLabel(string message)
        {
            myLabel.Text = message;
        }
    }

    public class NewClass
    {
        public NewClass()
        {
            // I want to call updateLabel("My message") here, but 'MyApp.updateLabel("My message");' didn't work even though I made updateLabel public
        }
    }
}

Как мне решить эту проблему? Я относительно новичок в C #, но у меня есть опыт работы с C, PHP, Java и JavaScript. Я использую Visual C # 2010 Express.

Ответы [ 6 ]

1 голос
/ 19 сентября 2010

Вам необходимо передать экземпляр класса MyApp классу NewClass.
Затем вы можете вызвать UpdateLabel на экземпляре MyApp, не делая метку общедоступной.

0 голосов
/ 05 мая 2013

Измените public void updatelabel(string message) на public static void updatelabel(string message).

Тогда с new class вы получите к нему доступ как myapp.updatelabel(message).

Вам придется добавить, используя myapp к началу нового класса.

0 голосов
/ 19 сентября 2010

Вероятно, лучше вызвать событие из вашего собственного класса, затем перехватить его в форме и обновить оттуда элементы управления, тогда вы не подключаете свою логику к определенным элементам пользовательского интерфейса.

0 голосов
/ 19 сентября 2010

Вот мое собственное предложенное решение. Я передаю myLabel в качестве параметра конструктору класса, которому нужен доступ к метке, например:

Звонок:

NewClass newClassObj = new NewClass(myLabel);

Класс:

public class NewClass
{
    public NewClass(Label myLabel)
    {
        myLabel.Text = "Hello world!";
    }
}

Если это не плохая практика программирования, я бы предпочел это решение. Мысли?

0 голосов
/ 19 сентября 2010

Может быть техника ниже будет полезна.Он может использовать Action или Func:

[Test]
        public void ActionsTest()
        {
            var parent = new Parent();
            parent.Child.RaiseCallFromParent();
            parent.Child.RaiseCallInParent();
        }

        public class Parent
        {
            private readonly Child _child = new Child();

            public Parent()
            {
                Child.ActionToCallMethodFromParent = methodCalledFromChild;
                Child.ActionToBeCalledInParent += actionCalledInParent;
            }

            public Child Child
            {
                get { return _child; }
            }

            private void actionCalledInParent()
            {
                Console.WriteLine("It is called in parent on child initiative.");
            }


            private void methodCalledFromChild()
            {
                Console.WriteLine("It is called from child");
            }
        }

        public class Child
        {
            public Action ActionToCallMethodFromParent;
            public Action ActionToBeCalledInParent;

            public void RaiseCallFromParent()
            {
                //This works in cases when you need to consume something from Parent but here you cannot take it directly
                if (ActionToCallMethodFromParent != null)
                    ActionToCallMethodFromParent();
            }

            public void RaiseCallInParent()
            {
                //This works like an event
                if (ActionToBeCalledInParent != null)
                    ActionToBeCalledInParent();
            }
        }
0 голосов
/ 19 сентября 2010

Поскольку updateLabel - это нестатический метод-член в MyApp, вам необходимо создать экземпляр MyApp перед вызовом любого из его методов экземпляра.

используйте следующую строку кода внутри NewClass ctor:

MyApp myapp = new MyApp();
myapp.updateLabel("Hello World");

Я предполагаю, что класс MyApp уже создан, и в этом случае вы должны передать ссылку на NewClass (может быть поверх конструктора), как уже упоминалось SLaks.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...