C # - как проверить, изменилось ли строковое значение в другом классе? - PullRequest
1 голос
/ 22 декабря 2011

У меня есть следующий класс:

class TestSomeData
{
    public string someString;
    public void CheckSomeStuff()
    {
         foreach(string x in someList)
         {
              someString = x;
          }
     }
 }

Что я хочу сделать, это:

TestSomeData test = new TestSomeData;
test.CheckSomeStuff();
label1.Content = test.someString;

Так что, если х равен 1,2,3,4,5 изиз someList в CheckSomeStuff, мне нужно label1.Content, чтобы отразить это, но из другого класса.как мне это сделать?

Ответы [ 3 ]

2 голосов
/ 23 декабря 2011

Класс может информировать другие классы об изменениях, внесенных в него, объявив события

public class SomeDataClass
{
    public event EventHandler SomeDataChanged;

    private string _someData;
    public string SomeData
    {
        get { return _someData; }
        set
        {
            if (value != _someData) {
                _someData = value;
                OnSomeDataChanged();
            }
        }
    }

    private void OnSomeDataChanged()
    {
        EventHandler eh = SomeDataChanged;
        if (eh != null) {
            SomeDataChanged(this, EventArgs.Empty);
        }
    }
}

class InterestedClass
{
    public void Work()
    {
        var someData = new SomeDataClass();
        someData.SomeDataChanged += new EventHandler(someData_SomeDataChanged);
        someData.SomeData = "New Value";
    }

    void someData_SomeDataChanged(object sender, EventArgs e)
    {
        Console.WriteLine("Some data changed: {0}", ((SomeDataClass)sender).SomeData);
    }
}

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

SomeDataClass.SomeDataChanged += new EventHandler(SomeDataClass_SomeDataChanged);

var someData = new SomeDataClass();
someData.SomeData = "New Value";
var someOtherData = new SomeDataClass();
someData.SomeData = "Other Value";
1 голос
/ 23 декабря 2011

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

class TestSomeData
{
    public TestSomeData(Label myControl) {
        this.MyControl = myControl;
    }

    private Label MyControl { get; set; }

    public void CheckSomeStuff()
    {
         if (this.MyControl == null) {
             // throw ArgumentNullException or InvalidOperationException
         }

         foreach(string x in someList)
         {
              this.MyControl.Content = x;
         }
     }
 }

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

0 голосов
/ 23 декабря 2011

Вы должны сделать это поле статическим . Все экземпляры этого класса будут иметь что-то общее. Любые изменения будут глобально.

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