用DataBindings屬性繫結控制元件的值

iDotNetSpace發表於2009-02-05

WinForm中的很多控制元件,如Label、TextBox等都包含DataBindings屬性,其型別為ControlBindingsCollection,是Binding類的集合。Binding類代表某物件屬性值和某控制元件屬性值之間的簡單繫結。如可以將TextBox的Text屬性值繫結到Label的Text屬性值,這樣,當TextBox中的文字被修改的時候,Label的文字也會及時進行修改,如下面的程式碼所示:

label1.DataBindings.Add("Text", textBox1, "Text");
.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } Binding類除了可以將物件的屬性繫結到控制元件的屬性之外,還可以將物件列表中當前物件的屬性值繫結到控制元件的屬性。
當使用Binding的建構函式建立例項時,必須指定三項內容:
  • 要繫結到的控制元件屬性的名稱
  • 資料來源
  • 資料來源中解析為列表或屬性的導航路徑
其中,資料來源可以為:
  • 實現 IBindingList 或 ITypedList 的任何類。包括:DataSet、DataTable、DataView 或 DataViewManager。
  • 實現 IList 的任意索引集合類。(必須在建立 Binding 之前建立和填充該集合,並且列表中的所有物件必須為同一型別,否則將引發異常)
  • 強型別物件的強型別 IList。

導航路徑可以為空字串(預設將呼叫資料來源的ToString()方法)、單個屬性名稱或用點分隔的名稱層次結構。

名稱層次結構是什麼意思呢?比如我們有一個Company類,它包含Name屬性和Employees屬性(公司所有Employee的集合),而Employee類又包含Name屬性。那麼,如果要將Company的Name屬性繫結到TextBox控制元件的Text屬性,程式碼為:

TextBox1.DataBindings.Add("Text", company, "Name");
.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }

如果要繫結Employees的Name屬性,程式碼為:

TextBox1.DataBindings.Add("Text", company, "Employees.Name");
.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } Employess.Name即為用點分隔的名稱層次結構。在這裡,Employees為一個集合,將Employees.Name繫結到TextBox會出現什麼情況呢?測試後可知,TextBox將顯示Employees集合中第一個Employee的Name屬性。

Binding類包含兩個十分重要的事件:Format和Parse,可以建立自定義的格式來顯示資料。具體可以參考MSDN。

問題:如果將TextBox2的Text屬性作為資料來源繫結到TextBox1的Text屬性,那麼修改TextBox1的Text之後,將焦點移動到TextBox2上,其Text值就變為TextBox1的Text值了。這一點如何解決,我還沒有找到比較好的方法,用Parse事件似乎也不行。希望各位朋友們指教。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-545374/,如需轉載,請註明出處,否則將追究法律責任。

相關文章