10 Mart 2014 Pazartesi

.Net DataBinding Bileşenler

Binding Bileşen Nedir?
Binding bileşenler kullandıkları DataSource değişince, gösterilen bilgiyi de değiştirirler.

DataGridView
Bu bileşenin DataSource alanı çok farklı çeşitlerde veriyi kullanabiliyor. En ilginci ise IList kullanabilmesi.
IList kullanabilmek için gösterilecek nesnenin string tipinde bir alanının olması gerekiyor.

Eğer gösterilecek liste çok büyükse VirtualMode kullanılmalı. DataGridViewCellValueEventArgs parametresi hangi satırın istendiğini belirtir.

Renk Değiştirme
AlternatingRowsDefaultCellStyle alanında BackColor farklı bir renk seçilirse, her tek satır yeni renk ile boyanır.

BindingList
DataSource ile IList tipinden bir listeyi birleştirebilmek için kullanılır. IList'in içindeki generik tipin public property'lerini DataGridView'e sütun olak ekler.

RaiseListChangedEvents
Eğer listeye değişklik yaparken, view nesnesi etkilenmesin istiyorsak aşağıdaki gibi yapabiliriz.
// stop raising update events
bindingList.RaiseListChangedEvents = false;

//Do something

// restore update events, raise reset event
bindingList.RaiseListChangedEvents = true;
bindingList.ResetBindings(); // Redraws entire view
INotifyPropertyChanged 
Bu arayüz modelin değiştiğini view sınıflarına bildirmek için kullanılıyor.  Arayüzden türeyen sınıflar
event PropertyChangedEventHandler PropertyChanged
şeklinde bir event tanımlamak zorunda. Çağırmak için ise
this.PropertyChanged (new PropertyChangedEventArgs ("MyProperty")); 

yapılabilir veya tüm property'lerin değiştiğini belirtmek için PropertyChangedEventArgs içine null geçilebilir.

Kendi Event Tanımlamamız

INotifyPropertyChanged arayüzü yerine kendimiz de bir event tanımlayabiliriz. Örneğin
public delegate void ModelChanged (object sender);
public event ModelChanged ModelChangedEvent;
Neden Delegate Yerine Event
Event kullanılmasının esas sebebi event'in sadece tanımlandığı sınıf içinden çağırılabilir olması.

public delegate void ReachedEventHandler(object sender);
public ReachedEventHandler fireEvent;
şeklinde tanımlanan bir delegate te aynı işi yapabilir. Geleneksel olarak bir event aşağıdaki imzaya sahiptir.
(object sender, EventArgs e);
Hazır Gelen EventHandler sınıfı
Eğer istenirse C# ile hazır gelen EventHandler sınıfı da kullanılabilir. Sınıfı kullanmak istediğimiz
parametre tipini veriyoruz.
Örnek:
public event EventHandler<MyEventArgs> MyEvent;
Hazı Gelen Action Sınıfı
C# ile hazır gelen Action <T> sınıfı da birden fazla parametre alabiliyor ve void dönüyor.


Binding Olmayan Diğer Bileşenler İçin Notlarım

ComboBox
Ekleme Yapmak
Bileşene yeni bir string eklemek için
combo.Items.Add ("MyItem");
Stringi Bulmak
Bu bileşenin içindeki bir stringi bulmak için FindStringExact veya FindString metodları kullanılabilir.

Salt Okunur Yapmak
combo.DropDownStyle = DropDownList; yapılarak salt okunur liste yapılabilir.

İlk Elemanı Seçmek
combo.SelectedIndex = 0; yapılarak ilk eleman seçilebilir.

Seçili stringi bulmak
stringvalue = combo.SelectedItem; yapılarak seçili string bulunabilir

Fare
MouseEventArg sınıfının X ve Y alanları ekrandaki koordinatı verir.

Fare hareket ederken sol tuş basılı kontrolü
Örnek:
bool draw = false;
void MouseMove(object sender, MouseEventArgs e){
 if (draw) {...}
}
void MouseDown(object sender, MouseEventArgs e){
    draw = true;
}
void MouseUp(object sender, MouseEventArgs e){
    draw = false;
}


Form
ToolForm açmak için
FormBorderStyle = SizableToolWindow;
ShowIcon = false;
ShowInTaskBar = false;
TopMost = true; yapılır


Klavye Tuşları
KeyDown
KeyDown event'i KeyPress'ten önce gelir. KeyEventArgs parametresini kullanarak tuş basıldığında Alt, Control gibi diğer tuşların durumunu öğrenmek mümkün.

void KeyDown (object sender, KeyEventArgs e){
    if (e.KeyCode == Keys.A) {}
}

KeyPress
Bu event ile gelen KeyPressEventArgs parametresini kullanarak hangi karakterin basıldığını öğrenmek mümkün.

ListView
ListView binding bir bileşen değil, kendisine verilen bilgisinin kopyasını alıyor gibi düşünülebilir.
ListView bileşeninin sağ üst köşesindeki küçük oka tıklanarak "View" tipi örneğin "Details" seçilebilir.

ListBox
Sütunları olmayan bir listedir.
Satırları renkli çizmek için DrawItemEventArgs kullanılabilir.
Satır eklemek için listBox.Items.Add (msg); kullanılır


OpenFileDialog ve SaveFileDialog
Bu bileşenler forma süreklenip bırakıldıktan sonra bir düğmenin tıklanma event'inde aşağıdakine benzer bir kod ile kullanılırlar.
this.openFileDialog.Filter = "(*.xml)|*.xml";
DialogResult result = this.openFileDialog.ShowDialog();
if (result == Dialog.OK)
{
    string file =  this.openFileDialog.FileName;

PropertyGrid
Bu nesne sadece public property'leri gösterir.
propertyGrid.ToolbarVisible = false;
propertyGrid.HelpVisible = false;
yaparak bazı paneller gizlenebilir.

Gösterilmek istenen sınıf başka bir sınıfı property olarak içeriyorsa, pencerede sadece o sınıfın fully qualified adı görünür. İç içe (nested) bir şekilde sınıfların alanlarını göstermek mümkün değil.

RichTextBox
Tüm satırları renklendirmek için aşağıdakine benzer bir kod kullanılabilir.

rtb.Clear ();
rtb.Text = "...";
Regex regEx = new Regex ("(.*)(\n)");
foreach (Match match in reg.Matches (rtb.Text))
{
   rtb.Select (match.Index,match.Length);
   rtb.SelectionColor = Color.Blue;
}
rtb.Select (rtb.TextLength,0);


TabCtrl
Aynı düğme gibi sürüklenip bırakılıyor. Sekmelerin arka plan rengi BackColor = Control yapılarak düzeltilebilir.

TreeView
Bu bileşen TreeNode nesnelerini gösterir. Bileşenin Nodes adlı bir collection property'si vardır. Bu listeye Add (TreeNode) veya Insert (int index, TreeNode) metodları ile yenı düğüm eklemek mümkün. Bir düğüm eklendikten sonra, Parent property'si otomatik olarak atanır.

Bileşendeki tüm nodları silmek için treeView.Nodes.Clear () metodu çağırılır.

Bileşenin içinde düğüm aramak yavaş olabilir. Bu yüzden TreeNode nesnelerini kendimizin hızlı erişilebilir şekilde saklamamız daha mantıklı.

Hiç yorum yok:

Yorum Gönder