2009-09-05 15 views
2

我通常使用C++編程,因此所有這些DataSource/DataSet/Binding的東西都讓我困惑不解。希望你們能幫忙。使用帶有文本框的數據源

基本上我正在編寫基於XML的文件格式(特別是OFX,用於財務數據)的編輯器。我在我的模式上使用了xsd.exe,將加載的文件反序列化成漂亮的普通舊類。我發現DataGridView非常出色,我可以將其DataSource屬性設置爲其中一個我感興趣的集合(特別是事務列表),並且當我查找這些值時,這些更改將反映在加載的反序列化的文件,然後我可以保存序列化。但是,當我想'映射'只是一個簡單的字符串到一個文本框(例如帳號),我不能在TextBoxes中使用這個聰明的方法似乎沒有DataSource成員...使用他們的'文本'屬性只是設置文本一次,並不反映回到底層對象的變化,因此保存必須首先從控件中獲取值。我希望它像DataGridView那樣是自動的。

我試着數據綁定擺弄,但我不知道作爲propertyName的或數據成員使用,所以我不知道這就是我打算使用:

accountNumberTextBox.DataBindings.Add(new Binding("???", myDocument.accountNumber, "???"); 

我錯過了真正明顯的東西嗎?但願如此!

回答

4

什麼你缺少的是string s爲在.NET中不可改變的。因此,對於綁定來說,任何意義都需要被其他東西封裝。當用戶輸入一個值時,數據綁定系統用現有的字符串替換

封裝string的東西可以是DataTable或包含更改通知的普通舊類。提供此更改通知的最佳方式是實現INotifyPropertyChanged界面。

例如:

public class Document : INotifyPropertyChanged 
{ 
    private string _accountNumber; 

    public string AccountNumber 
    { 
     get { return _accountNumber; } 
     set 
     { 
      if (_accountNumber != value) 
      { 
       _accountNumber = value; 
       //this tells the data binding system that the value has changed, so the interface should be updated 
       OnPropertyChanged("AccountNumber"); 
      } 
     } 
    } 

    //raised whenever a property value on this object changes. The data binding system attaches to this event 
    public event PropertyChangedEventHandler PropertyChanged; 

    private void OnPropertyChanged(string propertyName) 
    { 
     var handler = PropertyChanged: 

     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

所以,你的數據綁定掛鉤應該是這樣的:

var document = ...; //get document from somewhere 
//bind the Text property on the TextBox to the AccountNumber property on the Document 
textBox1.DataBindings.Add("Text", document, "AccountNumber"); 
+0

嗯,問題是,包含我想要綁定的字符串的類被生成。有沒有辦法做到這一點較少侵入? –

+0

@Pierre:謝謝,修正 –

+1

@Ben:您可以生成更改通知邏輯,也可以編寫一個包裝數據對象的類,並在UI中爲數據綁定添加更改通知。 –

2
accountNumberTextBox.DataBindings.Add("Text", 
             myDocumnt.Tables["your_table"], 
             "table_field"); 

例,

DataSet ds = new DataSet("DB"); 
DataTable dt = new DataTable("myTable"); 
dt.Columns.Add("Name"); 
dt.Rows.Add("PP"); 
dt.Rows.Add("QQ"); 
ds.Tables.Add(dt); 

textBox1.DataBindings.Add("Text", ds.Tables["myTable"], "Name"); 
+0

這就是我不明白;所有的DataSet/DataTable的東西。我已經有效地獲得了一個我想用作數據源的字符串;我是否需要將它放在單表DataSet中的單列,單行DataTable中以查找它? –

相關問題