2009-04-03 32 views
19

Amaç-c/kakao, bir kontrolün özelliklerinin (yani bir metin kutusundaki metnin) bir nesnenin özelliğine bağlı olabileceği bir bağlanma biçimi sunar. Bu işlevi C# w/.Net 3.5'de çoğaltmaya çalışıyorum.C# içindeki bir nesneye veri bağlama C#

ben dosya MyClass.cs aşağıdaki çok basit sınıfı oluşturduk:

class MyClass 
{ 
    private string myName; 

    public string MyName 
    { 
     get 
     { 
      return myName; 
     } 

     set 
     { 
      myName = value; 
     } 
    } 

    public MyClass() 
    { 
     myName = "Allen"; 
    } 
} 

Ben de 1 metin kutusu ve 1 düğme ile basit bir formu oluşturdu. Form kodunun içerisine bir örnek sınıfım init ettim ve projeyi oluşturdum. Vs2008'deki DataSource Sihirbazı'nı kullanarak, nesneye dayalı bir veri kaynağı oluşturmayı seçtim ve MyClass derlemesini seçtim. Bu bir veri kaynağı öğesi oluşturdu. Metin kutusunun bu veri kaynağına veritabanını değiştirdim; Ancak, beklenen sonuç (metin kutusunun içeriği "allen") elde edilmedi. Dahası, metin kutusuna metin koymak, nesnenin name özelliğini güncellemez.

Burada temel bir şeyi kaçırdığımı biliyorum. Bir noktada, form kodu içinde başlattığım MyClass sınıfının örneğini metin kutusuna bağlamam gerekiyordu, ancak bu gerçekleşmedi. Online baktığım her şey bir nesne ile DataBinding kullanarak (ya da tamamen işareti eksik) üzerinde parlak görünüyor, bu yüzden herhangi bir yardım büyük takdir edilmektedir.

Düzenleme: Ben de bunu yorum yaparsanız

this.myClassBindingSource.DataSource = typeof(BindingTest.MyClass); 

ve yerine:

Cevapları tarafından öğrendiklerini kullanarak, Visual Studio tarafından oluşturulan koda baktım, aşağıdaki vardı

Beklenen davranışı alıyorum. VS tarafından üretilen varsayılan kod neden böyle? Bunun işe yarayan yöntemden daha doğru olduğunu varsayarak, kodumun VS'nin yarattığı sınırlar içinde çalışacak şekilde nasıl değiştirmeliyim?

+0

varsayılan kod bu şekilde ele alınır. Ama çalışma zamanında gerçek bir örneğe ihtiyacınız var. –

cevap

15

Yeni veri kaynağınız olması için metin kutusunun veri kaynağını atamanız gerekir. Ancak ek olarak, veri kaynağının veri kaynağını sınıfınızın bir örneği olarak atamanız gerekir.

MyDataSource.DataSource = new MyClass(); 
TextBox1.DataSource = MyDataSource; 

Bu, ilk geçişiniz için çalışmalıdır. Diğerlerinin de belirttiği gibi, sınıf özelliklerini herhangi bir arka plan işlemi ile değiştirecekseniz, sınıfınızda ek arabirimler (INotifyPropertyChanged vb.) Uygulamanız gerekebilir. Yalnızca formu aracılığıyla özelliklerini güncelliyorsanız

, o zaman bu adımı gerekmez. mal beyanı üzerine {;; set almak}

+3

TextBox1.DataBindings.Add (Kişisel Nesne <, "> PropertyName < "> "Metin") yeni bir değer ayarlamak jsut, otomatik olarak üretilen kod çıkarmayın bir alan tanımlar, Bir alana bağlama yapamayacağınız doğrudur, ancak bir "açıkça bildirilen özellik" olmadığından değil. "public string FirstName;", bir özellik değil! Bir şey önerebilirsem , eğer aldığınız belirli bir hata mesajını kopyalayıp yapıştırabilirseniz, bu da arama yapan birinin postanızı bulmasına yardımcı olabilir. Katkıda bulunduğunuz için teşekkürler, notunuz aslında yolda birisine yardım edeceksiniz! –

12

Sen Sınıfım türüne INotifyPropertyChanged arabirimini uygulamalıdır:

public class MyClass : INotifyPropertyChanged 
{ 
    private string _myName; 

    public string MyName 
    { 
     get { return _myName; } 
     set 
     { 
      if(_myName != value) 
      { 
       _myName = value; 
       OnPropertyChanged("MyName"); 
      } 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    private void OnPropertyChanged(string propertyName) 
    { 
     if(PropertyChanged != null) 
      PropertyChanged(this , new PropertyChangedEventArgs(propertyName)); 
    }  
} 

Bu arayüz DataBinding altyapı için gerekli olan basit veri bağlama desteklemek istiyorlarsa. INotifyPropertyChanged arabirimi, bir özelliğin değiştirdiği bir 'bağlayıcı' bildirmek için kullanılır, bu nedenle DataBinding altyapısı buna göre davranabilir. Daha sonra, MyName özelliğini metin kutusunun Metin Özelliği'ne aktarabilirsiniz. muhtemelen Kimimben özellikte bir Bindable niteliğini ihtiyaç (ve aynı zamanda Frederik öneri izleyin) gibi

0

görünüyor:

[System.ComponentModel.Bindable(true)] 
    public string MyName 
    { 
     get { return _myName; } 
     set 
     { 
      if(_myName != value) 
      { 
       _myName = value; 
       OnPropertyChanged("MyName"); 
      } 
     } 
    } 

Via: Ben önümde herhangi bir kod yok http://support.microsoft.com/kb/327413

0

Ama bence veri kaynağı bir koleksiyon gibi. Veri kaynağına bir örnek MyClass eklemek zorundasınız ve bu, form alanlarının bağlanacağı şeydir. Veri kaynağında birden çok MyClass örneğine gitmek için yöntemler de vardır, ancak buna ihtiyacınız olduğu gibi gelmez. DataSource için dokümanları kontrol edin.

Herhangi bir fantezi arabirimini uygulamanız gerektiğini sanmıyorum. Veri kaynağında, bazı değerleri değiştirdikten sonra geçerli öğeyi yenilemenizi veya yeniden adlandırmanızı sağlayan bir yöntem olduğunu hatırlıyorum.

3

Ben

Bu açık kaçırdığını muhtemelen çünkü DataBinding.Add("TEXT", myObject, myObjectProperty) yöntemde bir hata mesajı alıyorum!

KÖTÜ:

public string FirstName; //<-- you will not be able to bind to this property! 

İYİ:

public string FirstName { get; set; } 
+0

kamu dize Ad;; Formunuzu yüklenmesinden veya bir şey –

0
using System.Collections.Generic; 

public class SiteDataItem 
{ 
private string _text; 
private string _url; 
private int _id; 
private int _parentId; 

public string Text 
{ 
    get 
    { 
     return _text; 
    } 
    set 
    { 
     _text = value; 
    } 
} 

public string Url 
{ 
    get 
    { 
     return _url; 
    } 
    set 
    { 
     _url = value; 
    } 
} 
public int ID 
{ 
    get 
    { 
     return _id; 
    } 
    set 
    { 
     _id = value; 
    } 
} 
public int ParentID 
{ 
    get 
    { 
     return _parentId; 
    } 
    set 
    { 
     _parentId = value; 
    } 
} 
public SiteDataItem(int id, int parentId, string text, string url) 
{ 
    _id = id; 
    _parentId = parentId; 
    _text = text; 
    _url = url; 
} 

public static List<SiteDataItem> GetSiteData() 
{ 
    List<SiteDataItem> siteData = new List<SiteDataItem>(); 
    siteData.Add(new SiteDataItem(1, 0, "All Sites", "")); 
    siteData.Add(new SiteDataItem(2, 1, "Search Engines", "")); 
    siteData.Add(new SiteDataItem(3, 1, "News Sites", "")); 
    siteData.Add(new SiteDataItem(4, 2, "Yahoo", "http://www.yahoo.com")); 
    siteData.Add(new SiteDataItem(5, 2, "MSN", "http://www.msn.com")); 
    siteData.Add(new SiteDataItem(6, 2, "Google", "http://www.google.com")); 
    siteData.Add(new SiteDataItem(7, 3, "CNN", "http://www.cnn.com")); 
    siteData.Add(new SiteDataItem(8, 3, "BBC", "http://www.bbc.co.uk")); 
    siteData.Add(new SiteDataItem(9, 3, "FOX", "http://www.foxnews.com")); 
    return siteData; 
} 
} 

daha fazla ayrıntı size öğretici dapfor okuyabilirsiniz. tasarım zamanında tüm kontrollerin karşı databind sunulacak özelliklerin çeşitli bilmesi com

İlgili konular