Append | Engin Polat\'ın Windows 8 , Windows Phone 8 ve C# içerikli programcılık sitesi

Arşiv

Etiketlenen yazılar append

StringBuilder alternatifi olarak String.Join

07 February 2012 Yorum yapılmamış

String sınıfının immutable olduğunu duymayanımız kalmamıştır (bknz; string sınıfı neden immutable?)

string tipindeki bir değişkenin değeri üzerinde sürekli değişiklik yapıp Garbage Collector‘a gereksiz iş oluşturmak yerine, StringBuilder sınıfını kullanırız (Garbage Collector hakkında detaylı bilgi için bknz; Garbage Collector Temelleri ve Performans Noktaları)

Çeşitli sebeplerden dolayı (Loglama, XML veya JSON veri üretme, vs) sınıflarımızın ToString() method’larını override ederiz (bknz; ToString() Method’unu override etmek)

ToString() method’undan geriye string değer döndüreceğimiz için method içerisinde string değer tutabilecek bir değişkene ihtiyaç duyarız. Bu değişken yukarıda bahsettiğimiz nedenlerden dolayı genelde StringBuilder tipinde olur.

Örnek ProductOrderCollection sınıfımızın ProductID ve Orders isminde property‘leri olduğunu varsayalım;

public class ProductOrderCollection
{
	public int ProductID { get; set; }

	public IEnumerable<Order> Orders{ get; set; }
}

ToString() method’unu override ettiğimiz örnek kod parçası;

public override string ToString()
{
	StringBuilder sb = new StringBuilder();
	sb.Append("Product{Id=");
	sb.Append(this.Id);
	sb.Append(",Orders=");
	if (this.Orders == null)
	{
		sb.Append("null");
	}
	else
	{
		sb.Append("[");
		for (int i = 0; i < this.Orders.Length; i++)
		{
			if (i > 0 && i < this.Orders.Length - 1)
			{
				sb.Append(",");
			}

			sb.Append(this.Orders[i]);
		}

		sb.Append("]");
	}

	sb.Append("}");

	return sb.ToString();
}

Yukarıdaki örnek kod sayesinde ProductOrderCollection sınıfının verilerinden JSON değer üretebiliriz.

StringBuilder sınıfı yerine String.Join methodunu kullanarak yapacak olsaydık;

public override string ToString()
{
	StringBuilder sb = new StringBuilder();
	sb.Append("Product{Id=");
	sb.Append(this.Id);
	sb.Append(",Orders=");
	if (this.Orders == null)
	{
		sb.Append("null");
	}
	else
	{
		sb.Append("[");
		sb.Append(string.Join(",", this.Orders));
		sb.Append("]");
	}

	sb.Append("}");

	return sb.ToString();
}

Hatta if/else kod parçasını daha da kısaltabiliriz;

public override string ToString()
{
	StringBuilder sb = new StringBuilder();
	sb.Append("Product{Id=");
	sb.Append(this.Id);
	sb.Append(",Orders=");
	sb.Append(this.Orders == null ? "null" : "[" + string.Join(",", this.Orders) + "]");
	sb.Append("}");

	return sb.ToString();
}

StringBuilder sınıfını hiç kullanmamak için;

public override string ToString()
{
	return string.Join("Product{Id=", this.Id, ",Orders=", this.Orders == null ? "null" : "[" + string.Join(",", this.Orders) + "]", "}");
}

C# Textbox’ın AutoComplete Özelliği

23 August 2010 4 yorum

Genellikle web uygulamalarında gördüğümüz metin kutularının otomatik tamamlama özelliğini Windows Masaüstü uygulamalarımıza da ekleyebiliriz.

Yapmamız gereken, otomatik tamamlama özelliği vermek istediğimiz Textbox‘ın birkaç özelliğini ayarlamak;

AutoCompleteMode :
Varsayılan olarak None değerini içerir
Append, yazılan harflere uyan ilk kelimenin kalanını textbox’a ekler ve seçili hale getirir
Suggest, aşağı açılan listeyi gösterir
SuggestAppend, hem aşağı açılan listeyi gösterir, hem de yazılan harflere uyan ilk kelimenin kalanını textbox’a ekler ve seçili hale getirir

AutoCompleteSource :
Varsayılan olarak None değerini içerir
FileSystem, FileSystemDirectories, HistoryList, RecentlyUsedList, AllSystemSources, AllUrl, CustomSource değerlerinden birini içerebilir

AutoCompleteCustomSource :
AutoCompleteSource özelliği CustomSource olarak atanmışsa AutoCompleteCustomSource özelliği string dizisi olarak listeyi tutar

Önce aşağıdaki ekran görüntüsünde form oluşturalım;

TextBox AutoCompleteMode Form

Öncelikle formumuzun yüklenme olayında (Form_Load Event) Kaynak açılır listesine (ComboBox), otomatik tamamlama kaynaklarının listesini ekleyelim;

cmbKaynak.Items.Add(AutoCompleteSource.CustomSource);
cmbKaynak.Items.Add(AutoCompleteSource.FileSystem);
cmbKaynak.Items.Add(AutoCompleteSource.FileSystemDirectories);
cmbKaynak.Items.Add(AutoCompleteSource.HistoryList);
cmbKaynak.Items.Add(AutoCompleteSource.RecentlyUsedList);
cmbKaynak.Items.Add(AutoCompleteSource.AllSystemSources);
cmbKaynak.Items.Add(AutoCompleteSource.AllUrl);

TextBox AutoCompleteSource List

Daha sonra, TextBox‘ın AutoCompleteMode ve AutoCompleteCustomSource özelliklerine değer atamaları yapalım;

txtWebSitesi.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
txtWebSitesi.AutoCompleteCustomSource.AddRange(new string[] { "http://www.enginpolat.com", "http://www.karalamalar.net", "http://www.cebirci.com", "http://www.kadirgunay.com" });
cmbKaynak.SelectedIndex = 0;

Son olarak, Kaynak combobox‘ının seçili eleman değişti olayında (SelectedIndexChanged Event) textbox‘ın AutoCompleteSource özelliğini değiştiriyoruz;

txtWebSitesi.AutoCompleteSource = (AutoCompleteSource)cmbKaynak.SelectedItem;

TextBox AutoCompleteCustomSource

TextBox AutoCompleteSource FileSystem

TextBox AutoCompleteSource History List

Örnek uygulamanın tüm kaynak kodu;

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;

public partial class frmMain : Form
{
	public frmMain()
	{
		InitializeComponent();
	}

	private void frmMain_Load(object sender, EventArgs e)
	{
		cmbKaynak.Items.Add(AutoCompleteSource.CustomSource);
		cmbKaynak.Items.Add(AutoCompleteSource.FileSystem);
		cmbKaynak.Items.Add(AutoCompleteSource.FileSystemDirectories);
		cmbKaynak.Items.Add(AutoCompleteSource.HistoryList);
		cmbKaynak.Items.Add(AutoCompleteSource.RecentlyUsedList);
		cmbKaynak.Items.Add(AutoCompleteSource.AllSystemSources);
		cmbKaynak.Items.Add(AutoCompleteSource.AllUrl);

		txtWebSitesi.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
		txtWebSitesi.AutoCompleteCustomSource.AddRange(new string[] { "http://www.enginpolat.com", "http://www.durgut.com", "http://www.karalamalar.net", "http://www.kadirgunay.com", "http://www.microsoft.com", "http://www.bilgeadam.com", "http://www.ntvmsnbc.com", "http://www.arcelik.com" });

		cmbKaynak.SelectedIndex = 0;
	}

	private void cmbKaynak_SelectedIndexChanged(object sender, EventArgs e)
	{
		txtWebSitesi.AutoCompleteSource = (AutoCompleteSource)cmbKaynak.SelectedItem;
	}

	private void lblenginpolatcom_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
	{
		Process.Start("http://www.enginpolat.com");
	}
}