Makale Özeti

Bu makalemde textbox'dan oluşan bir Windows uygulamasında hergün birçok kere yaptığımız iki işlemi C# ile kendi uygulamamız için yazacağız. Bu işlemlerden ilki bir text dosyasına sağ tıkladığımızda açılan context menüde yeralan Open With... öğesine tıkladığmızda kendi uygulamamızı seçerek text dosyasının uygulamamız içindeki TextBox içinde açılmasını sağlamak olacak.

Makale

    Merhabalar,

    Bu makalemde textbox'dan oluşan bir Windows uygulamasında hergün birçok kere yaptığımız iki işlemi C# ile kendi uygulamamız için yazacağız. Bu işlemlerden ilki bir text dosyasına sağ tıkladığımızda açılan context menüde yeralan Open With... öğesine tıkladığmızda kendi uygulamamızı seçerek text dosyasının uygulamamız içindeki TextBox içinde açılmasını sağlamak olacak. Diğeri ise bir text dosyasını uygulamamız üstüne sürükleyip bıraktığımızda içeriğinin uygulamamızda görüntülenmesi olacak.

    İlk olarak text dosyalarını Open With aracılığıyla uygulamamızda açtığımızda içeriklerinin uygulamamızda görüntülenmesini sağlayan kodu yazalım.

static class Program
{
    [STAThread]
    static
void Main(string[] args)
   
{
        string
fileName = "";
        if
(args.GetLength(0) > 0)
        {
            fileName = args[0];
        }
        Application
.EnableVisualStyles();
        Application
.SetCompatibleTextRenderingDefault(false);
        Application
.Run(new Form1(fileName));
    }
}


    Görüldüğü üzere uygulamamızdaki Program.cs class file'ında bazı değişiklikler yaparak başladık. Uygulama başlarken Main metodunda args string array'ini parametre olarak geçiriyoruz. Bu array'in ilk öğesinde (args[0]) Open With ile açılan dosyanın ismi tutulacak. Metodun başlangıcında string tipinde fileName değişkenini tanımlıyoruz. args array'inin ilk sırasında eleman bulunuyorsa bu elemanın değerini fileName property'sine eşitliyoruz.

    Ardından ise formumuzun string tipinden parametre alan ikinci constructor'ı ile uygulamamızı çalıştırıyoruz.

    Formumuzun string tipinden değişkeni parametre alan constructor'ına ise aşağıdaki kodu yazıyoruz:


public
Form1(string fileName)
{
    InitializeComponent();
    if
(fileName != "")
    {
       
StreamReader sr = new StreamReader(fileName, Encoding.GetEncoding("iso-8859-9"));
        txtYazi.Text = sr.ReadToEnd();
        sr.Close();
    }
}


    Formun bu constructor'ında fileName yani sağ tıklayıp Open With ile açmak istediğimiz dosyanın yolu boş gelmemişse StreamReader nesnesine fileName parametresini geçirerek dosyayı okuyup, formumuzdaki TextBox'a yazdırıyoruz.

    Uygulamamızı derledikten sonra herhangi bir text dosyasına sağ tıklayıp program listesinden uygulamamızı seçtiğimizde ve açtığımızda text dosyasının içeriğini uygulamamızdaki textbox'ta görebiliriz:



    Şimdi sıra uygulamamıza başka bir text dosyasını sürükleyip bıraktığımızda dosya içeriğinin textbox'ta görüntülenmesini sağlamaya geldi. Kodlamaya geçmeden önce formumuzdaki textbox'ın AllowDrop property'sini true olarak set etmemiz gerekiyor. Ardından ise textbox'ın DragDrop ve DragEnter event'lerini handle ediyoruz. Sürükleyip bırakılan dosyanın içeriğini almak için textbox'ın DragDrop ve DragEnter event'lerini handle edeceğiz. Fakat öncesinde Windows formlarında sürükleyip bırakma ve clipboard'dan kopyalama-yapıştırma işlemlerinin yapılmasını sağlayan DataObject class'ından bahsedeceğim.

    C#'da DataObject class'ı biraz önce de bahsettiğim gibi clipboard işlemleri ve sürükle-bırak işlemlerini gerçekleştirmemizi sağlayan class'tır. IDataObject interface'ini implement etmiştir ve dosya sürükleme bırakma işlemi yapıldığı zaman sürükleyip bırakılan dosyaların isimlerinin tutulduğu bir array'i taşır. DataObject class'ının DataFormats class'ı ile de hangi türde dosya ile işlem yaptığımızı belirtebiliriz. DataObject nesnesinde sürükleme bırakma veya kopyalama yoluyla dosya taşımak için SetData metodu veya DataObject'in constructor'ı kullanılır. DataObject'in taşıdığı verilere erişmek içinse GetData metodu kullanılır.


    Bu açıklamalardan sonra ilk olarak txtYazi textbox'ının DragEnter event'ini handle ederek kodlamaya başlayalım. DragEnter event'i herhangi bir sürükleme-bırakma işlemi başlamışsa ve fare imleci ilgili kontrole girmişse tetiklenir. DragEnter event'i handle edilmişse kullanıcı kontrol üstüne bir dosyayı sürüklediğinde kontrolün sürükleme-bırakma işlemine uygun olduğuna dair imleç oluşur. Bu event'in parametrelerinden DragEventArgs'ın Data property'si IDataObject tipindendir.
   
    Bizim bu event tetiklendiği zaman yapmamız gereken şey GetDataPresent fonksiyonu ile DataObject içinde taşınan veri sürükleme bırakma sonucu oluşmuşsa DragEventArgs'ın Effect property'sini DragDropEffects.Copy olarak set etmek olacaktır.
DragDropEffects enumeration'ı bir dosya sürüklenip bırakıldığı zaman bırakılacağı yere ne şekilde taşınacağının set edilmesini sağlar. Biz örneğimizde kopyalanması için Copy DragDropEffect'ini kullandık. Aksi durumlar için de Effect property'sini DragDropEffects.None olarak set ettik:

private void txtYazi_DragEnter(object sender, DragEventArgs e)
{
    if (e.Data.GetDataPresent(DataFormats.FileDrop))
    {
        e.Effect = DragDropEffects.Copy;
    }
   
else
   
{
        e.Effect = DragDropEffects.None;
    }
}


    Şimdi de sırada txtYazi'nin DragDrop event'ini handle etmek var. Kullanıcı dosyayı kontrol üzerindeyken bırakırsa DragDrop event'i tetiklenir. Biraz önce DataObject class'ının sürüklenip bırakılan verilerin tutulduğu bir array taşıdığından bahsetmiştim. Bizim bu event'i handle ederken yapmamız gereken de bu array'de tutulan veriyi GetData fonksiyonuyla almak olacaktır. Ardından da bir array tanımlayıp bu veriyi de array'e atadıktan sonra bu array'in taşıdığı dosyayı Array nesnesinin GetValue fonksiyonuyla alıyoruz. Dosyayı StreamReader ile okuyup txtYazi'nin Text property'sine atıyoruz:

private void txtYazi_DragDrop(object sender, DragEventArgs e)
{
   
//txtYazi'nin AllowDrop property'si true olmalı!!
   
Array a = (Array)e.Data.GetData(DataFormats.FileDrop);
    if
(a != null)
    {
        string
s = a.GetValue(0).ToString();
        StreamReader
sr = new StreamReader(s);
        txtYazi.Text = sr.ReadToEnd();
        sr.Close();
        this
.Activate();       
    }
}

    Bu makalemde C# ile Open With context menü öğesinin kullanımı ve sürükle-bırak işlemlerinin nasıl yapıldığını açıklamalar ve örnekler ile anlatmaya çalıştım. Örneklerde de görüldüğü gibi oldukça rahat bir biçimde bu iki işlemi Windows uygulamalarımızda kullanabiliriz. Faydalı olmasını umarım.

Işıl ORHANEL
 

Ornek Kodlar