7 Temmuz 2012 Cumartesi

C# ile ListView

Merhaba Webkolog okurları! Bugün C# .Net Framework 4 ve Visual Studio 2010 kullanarak uygulamalarımızda verileri liste halinde görüntülemek ve yönetmek için sıkça kullandığımız ListView kontrolünü yakından inceleyeceğiz. ListView, özellikle tablo benzeri verileri göstermek, sıralamak, gruplandırmak ve kullanıcı etkileşimini sağlamak için oldukça güçlü ve esnek bir araçtır. Gelin, bu kontrolün temel özelliklerine ve kullanımına birlikte göz atalım.

ListView Kontrolü Nedir?

ListView kontrolü, öğeleri satırlar ve sütunlar halinde görüntüleyen bir Windows Forms kontrolüdür. Her satır bir veya daha fazla sütundan oluşur ve her satır bir ListViewItem nesnesiyle temsil edilir. ListView, farklı görünümler (View) destekler ve verileri sıralama, gruplandırma, düzenleme gibi çeşitli işlevlerle zenginleştirilebilir.

Temel Kavramlar

  • ListViewItem: ListView'deki bir satırı temsil eden nesnedir. Her satır, bir ana metin ve alt öğeler (SubItems) içerebilir.
  • ColumnHeader: ListView'deki bir sütunu temsil eden nesnedir. Her sütunun bir başlık metni, genişliği ve diğer özellikleri vardır.
  • View: ListView'in öğeleri nasıl görüntüleyeceğini belirleyen özelliktir. Farklı görünümler (Details, List, LargeIcon, SmallIcon, Tile) desteklenir.
  • Groups: ListView öğelerini gruplar halinde görüntülemeyi sağlar. Her grup bir ListViewGroup nesnesiyle temsil edilir.

ListView Kontrolünü Kullanma

  1. ListView Oluşturma:
    • Visual Studio 2010'da, Toolbox'tan bir ListView kontrolünü formunuza sürükleyerek veya kodda bir ListView nesnesi oluşturarak başlayabilirsiniz.
  2. Sütunları Ekleme:
    • ListView'e sütun eklemek için Columns.Add() metodunu kullanırız. Özellikle Details görünümünde sütunlar önemlidir.
  3. Öğeleri Ekleme:
    • ListView'e öğe eklemek için Items.Add() metodunu kullanırız. Her öğe bir ListViewItem nesnesi olmalıdır.

Örnek Kullanım

Aşağıdaki örnekte, bir ListView'e gruplandırılmış öğeler eklemeyi, sütunları ayarlamayı ve bazı temel özellikleri yapılandırmayı gösteriyoruz:

// Gruplu ListView örneği
ListViewItem li = new ListViewItem("Ali");
li.SubItems.Add("26");
li.SubItems.Add("İstanbul");
ListViewItem li2 = new ListViewItem("Veli");
li2.SubItems.Add("27");
li2.SubItems.Add("İstanbul");
// li2.Group.Header = "asd"; // Bu satırda hata var, Group özelliğine direkt olarak string atanamaz.
ListViewItem li3 = new ListViewItem("Deli");
li3.SubItems.Add("28");
li3.SubItems.Add("İstanbul");
ListViewGroup lvg = new ListViewGroup("7 Temmuz 2012"); // Bir grup oluşturuyoruz.
lvg.Items.Add(li); // Gruba öğeleri ekliyoruz.
lvg.Items.Add(li2);
listView1.Items.Add(li);  // ListView'e öğeleri ekliyoruz.
listView1.Items.Add(li2);
listView1.Items.Add(li3);
listView1.Groups.Add(lvg); // ListView'e grubu ekliyoruz.
listView1.GridLines = true;        // Izgara çizgilerini göster.
listView1.FullRowSelect = true;    // Tüm satırı seç.
listView1.View = View.Details;    // Detaylı görünümü kullan.
listView1.AllowColumnReorder = true; // Sütunların yeniden sıralanmasına izin ver.
listView1.MultiSelect = false;     // Çoklu seçimi devre dışı bırak.
listView1.Dock = DockStyle.Fill;   // ListView'i formun tamamına yasla.
listView1.Visible = true;         // ListView'i görünür yap.
// Sütunları ekleyelim (Details görünümü için)
listView1.Columns.Add("Ad", 100);
listView1.Columns.Add("Yaş", 50);
listView1.Columns.Add("Şehir", 100);

Bu örnekte, önce üç ListViewItem oluşturduk ve her birine alt öğeler (yaş ve şehir) ekledik. Ardından, bir ListViewGroup oluşturarak bu öğeleri gruplandırdık. Son olarak, ListView'in özelliklerini ayarladık ve sütunları ekledik.

ListView Kontrolünün Özellikleri

  • Items: ListView'deki tüm öğeleri içeren koleksiyon.
  • Columns: ListView'deki sütunları içeren koleksiyon (Details görünümü için).
  • View: ListView'in görünümünü belirler (Details, List, LargeIcon, SmallIcon, Tile).
  • Groups: ListView'deki grupları içeren koleksiyon.
  • GridLines: Izgara çizgilerinin görüntülenip görüntülenmeyeceğini belirler.
  • FullRowSelect: Bir öğe seçildiğinde tüm satırın seçilip seçilmeyeceğini belirler.
  • MultiSelect: Kullanıcının birden fazla öğe seçip seçemeyeceğini belirler.
  • AllowColumnReorder: Kullanıcının sütunları sürükleyerek yeniden sıralayıp sıralayamayacağını belirler.
  • Sorting: ListView'in öğeleri nasıl sıralayacağını belirler (None, Ascending, Descending).
  • CheckBoxes: Her öğenin yanında bir onay kutusu görüntülenip görüntülenmeyeceğini belirler.

ListView Kontrolünün Olayları

  • ItemCheck: Bir öğenin onay kutusu durumu değiştiğinde tetiklenir.
  • ColumnClick: Bir sütun başlığına tıklandığında tetiklenir.
  • SelectedIndexChanged: Seçili öğe değiştiğinde tetiklenir.
  • ItemActivate: Bir öğeye çift tıklandığında veya Enter tuşuna basıldığında tetiklenir.

Örnekler

  • Seçili Öğeleri Çizgili Yapma:

private void listView1_ItemCheck(object sender, ItemCheckEventArgs e)
{
    int a = e.Index;
    listView1.Items[a].Font = new Font(listView1.Font, listView1.Font.Style | FontStyle.Strikeout);
}

  • Genişliği 0 Olan Sütunun Yeniden Boyutlandırılmasını Engelleme:

void listView_ColumnWidthChanging(object sender, ColumnWidthChangingEventArgs e)
{
    e.Cancel = true; // İptal et
    if (listView1.Columns[e.ColumnIndex].Width == 0)
        e.NewWidth = 0;
}

  • Sütuna Tıklayarak Sıralama:

private int sortColumn = -1;
private void listView1_ColumnClick(object sender, ColumnClickEventArgs e)
{
    if (e.Column != sortColumn)
    {
        sortColumn = e.Column;
        listView1.Sorting = SortOrder.Ascending;
    }
    else
    {
        if (listView1.Sorting == SortOrder.Ascending)
            listView1.Sorting = SortOrder.Descending;
        else
            listView1.Sorting = SortOrder.Ascending;
    }
    listView1.Sort();
    this.listView1.ListViewItemSorter = new ListViewItemComparer(e.Column, listView1.Sorting);
}
class ListViewItemComparer : IComparer
{
    private int col;
    private SortOrder order;
    public ListViewItemComparer()
    {
        col = 0;
        order = SortOrder.Ascending;
    }
    public ListViewItemComparer(int column, SortOrder order)
    {
        col = column;
        this.order = order;
    }
    public int Compare(object x, object y)
    {
        int returnVal = -1;
        returnVal = String.Compare(((ListViewItem)x).SubItems[col].Text, ((ListViewItem)y).SubItems[col].Text);
        if (order == SortOrder.Descending)
            returnVal *= -1;
        return returnVal;
    }
}

  • Başlığa Sağ Tıklayarak Context Menu Gösterme:

private Rectangle _headerRect;
private static ColumnHeader[] GetOrderedHeaders(ListView lv)
{
    ColumnHeader[] arr = new ColumnHeader[lv.Columns.Count];
    foreach (ColumnHeader header in lv.Columns) { arr[header.DisplayIndex] = header; }
    return arr;
}
private void regularListViewMenu_Opening(object sender, CancelEventArgs e)
{
    EnumChildWindows(listView1.Handle, new EnumWinCallBack(EnumWindowCallBack), IntPtr.Zero);
    if (_headerRect.Contains(Control.MousePosition))
    {
        e.Cancel = true;
        int xoffset = Control.MousePosition.X - _headerRect.Left;
        int sum = 0;
        foreach (ColumnHeader header in GetOrderedHeaders(listView1))
        {
            sum += header.Width;
            if (sum > xoffset)
            {
                HandleRightClickOnHeader(header);
                break;
            }
        }
    }
    else { }
}
private void HandleRightClickOnHeader(ColumnHeader header)
{
    headerMenu.Tag = header;
    headerMenu.Items[0].Text = "Command for Header " + header.Text;
    headerMenu.Show(Control.MousePosition);
}
private bool EnumWindowCallBack(IntPtr hwnd, IntPtr lParam)
{
    RECT rct;
    if (!GetWindowRect(hwnd, out rct))
    { _headerRect = Rectangle.Empty; }
    else
    { _headerRect = new Rectangle(rct.Left, rct.Top, rct.Right - rct.Left, rct.Bottom - rct.Top); }
    return false; // Stop the enum
}
private delegate bool EnumWinCallBack(IntPtr hwnd, IntPtr lParam);
[DllImport("user32.Dll")]
private static extern int EnumChildWindows(IntPtr hWndParent, EnumWinCallBack callBackFunc, IntPtr lParam);
[DllImport("user32.dll")]
private static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);
[StructLayout(LayoutKind.Sequential)]
private struct RECT
{
    public int Left;
    public int Top;
    public int Right;
    public int Bottom;
}

Sevgili Webkolog okurları, C# .Net Framework 4 ve Visual Studio 2010 kullanarak ListView kontrolünün temel kullanımını ve bazı önemli özelliklerini bu şekilde incelemiş olduk. Bu kontrol, uygulamalarınızda verileri düzenli bir şekilde görüntülemenize, kullanıcı etkileşimini artırmanıza ve veri yönetimi işlemlerini kolaylaştırmanıza yardımcı olur.

Webkolog'u takipte kalın!

Hepinize bol listeli ve başarılı projeler dilerim!

0 yorum:

Yorum Gönder