2009-09-05 2 views
2

Я обычно программирую на C++, поэтому весь этот материал DataSource/DataSet/Binding путает меня. Надеюсь, вы, ребята, можете помочь.Использование DataSource с TextBox

В основном я пишу редактор для формата файла на основе XML (в частности, OFX для финансовых данных). Я использовал xsd.exe в своей схеме для десериализации загруженных файлов в красивые, простые старые классы. Я обнаружил DataGridView, который является блестящим, и я могу просто установить его свойство DataSource в одну из интересующих меня коллекций (в частности, список транзакций), и когда я сошлюсь со значениями, которые эти изменения отразятся в загруженном десериализованный файл, который затем я могу сериализовать при сохранении. Но когда я хочу «отобразить» просто простую строку в TextBox (например, номер учетной записи), я не могу использовать этот умный метод в TextBoxes, похоже, не имеет члена DataSource ... Используя их свойство «Текст» просто устанавливает текст один раз и не отражает изменения обратно к базовому объекту, поэтому сохранение должно сначала захватить значения из элемента управления. Я бы хотел, чтобы она была автоматической, как для DataGridView.

Я пытался возиться с DataBindings, но я понятия не имею, что использовать в качестве ИмениСвойства или DataMember, так что я не уверен, что это то, что я имел в виду, чтобы использовать:

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

Я пропустил что-то действительно очевидное? Я надеюсь, что это так!

ответ

4

Что вы теряете, что string s неизменны в .NET. Таким образом, для привязки, чтобы иметь смысл, значение string должно быть инкапсулировано чем-то другим. Затем система привязки данных заменяет существующей строкой с новой, когда пользователь вводит значение.

Что-то еще, что инкапсулирует 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: вы можете либо сгенерировать логику уведомлений об изменении, либо написать класс, который обертывает ваш объект данных, и добавляет уведомление об изменении для целей привязки данных в пользовательском интерфейсе. –

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. Я просто получил строку, которую хочу использовать в качестве источника данных; мне нужно поместить это в одноколоночный однострочный DataTable в DataSet с одной таблицей, чтобы посмотреть его? –

Смежные вопросы