2011-12-22 18 views
0

我有一個類如下:C# - 如何檢查字符串值是否在不同的類中更改?

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; 

所以,如果x是1,2,3,4,5出someList的CheckSomeStuff,我需要label1.Content來反映,但來自不同的課程。我怎麼做?

+1

你想讓另一個類知道'someString'的值是否改變? – 2011-12-22 19:58:08

+2

您是否需要label1.Content來始終反映someString的當前狀態,還是需要將其設置一次並完成? – Adam 2011-12-22 19:59:02

+2

另外,請注意,foreach循環是不必要的,因爲someString總是以someList中的最後一個值結尾。 – Adam 2011-12-22 20:02:36

回答

2

一個類可以通過聲明事件

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"; 
0

你應該使該字段static。該類的所有實例都會有這樣的共同點。任何變化都將是全球性的。

+3

我不認爲這與問題有任何關係。 – Adam 2011-12-22 20:01:11

+0

從他說他想從另一個類訪問該值 – 2011-12-22 20:02:09

+0

使其成爲靜態不會改變任何關於從另一個類的可訪問性。 – Adam 2011-12-22 20:03:31

1

您可以傳遞對控件的引用,以便您可以直接更改其文本。不是說這個設計特別是漂亮的,但它會完成工作。

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; 
     } 
    } 
} 

也爲其他人指出,控制將永遠在列表中找到的最後值。如果您試圖讓列表中的每個值都顯示爲列表,您將不得不添加一些UI邏輯來強制刷新或重新繪製控件。

+0

可能是很好的檢查它在設置內容之前爲空? – Adam 2011-12-22 20:07:21

+0

@codesparkle當然。我會爲此編輯。爲了簡潔起見,我只是想做出最小的改變來完成任務。 – Yuck 2011-12-22 20:08:16

+2

這使得該類與標籤控件更緊密地結合在一起。如果他以後需要用別的東西來使用它會怎麼樣?事件處理程序確實是更好的解決方案。 – 2011-12-22 21:34:13

相關問題