RadControls – Select RadGridView GroupRowInfo

Eğer RagGridView üzerinde Gruplama işlemine izin veriyorsanız ve bir satır seçildiğinde özel bir işlem yapıyorsanız. Gruplama sonrasında RadGridView ‘ın oluşturduğu “Grup Satırlarınıseçince bir hata alabilirsiniz.. Bunun sebebi RadGridView’ın CurrentRow’unun bir “GridViewRowInfo” tipinde olmamasıdır. “GridViewGroupRowInfo” tipinde olmasıdır. Bu durumda seçilen bir grubun sahip olduğu satır varsa, ilk satırın seçilmesini isteyebilirsiniz..

'' DataGrid ?zerinde gruplama yap?ld?ysa ve grid ?zerinde grup sat?r? se?ilirse,'' GridViewGroupRowInfo tipindedir ve hata f?rlamamas? i?in kontrol edilir.
    If (Me.GridView1.CurrentRow.GetType Is GetType (Telerik.WinControls.UI.GridViewGroupRowInfo)) Then

        Dim rowInfo As Telerik.WinControls.UI.GridViewRowInfo = _
            DirectCast(Me.GridView1.CurrentRow, Telerik.WinControls.UI.GridViewRowInfo)
        Dim groupRowInfo As Telerik.WinControls.UI.GridViewGroupRowInfo = _
            DirectCast(rowInfo, Telerik.WinControls.UI.GridViewGroupRowInfo)
        Dim dataGroup As Telerik.WinControls.UI.DataGroup = _
            DirectCast(groupRowInfo.Group, Telerik.WinControls.UI.DataGroup)

        If (dataGroup.RowCount > 0) Then        
            Me.GridView1.CurrentRow = dataGroup.Item(0)    
        Else        
            Exit Sub    
        End If
    End If

VB,CS – ApplicationEvents.vb ve program.cs ile Uygulama Genel İşlemleri

Uygulamalarımda ihtiyaç duyduğum işlemlerin başında tek bir noktadan uygulama login işlemlerini ve hata kaydetme işlemlerini yönetebilmektir. Login işlemi belki buna pek uymadı. Çünkü zaten tek bir login bölümü olur ve kullanıcı buradan uygulamaya giriş yapar. Peki şöyle bir durumda ne yapacaksınız. solution(çözümünüzde) projelerini yer almaktadır. Fakat bu projelerimizden biri genelde “Test Projemiz” olur. Bu durumda genelde test projesinde login bölümünü koymayız. Hızlı bir şekilde, bir test kullanıcı adı ve şifresi ile girilmiş gibi bilgisayarı kandıracak kodu “Form_Load” olayına yazarız yada bunu bir Class yapar ve Form açılışında bu Class’ın işlemesini sağlarız. Tabii ki test işlemlerimiz bazen tek form üzerinde yapabiliriz ama genelde Test projesi fazlaca form içerir ve bu form’ların her birinde bir test işlemi yer alır. Dolayısı ile bu form’ların her birinde login işlemini yapan class’ın çalışmasını isteriz..

Bu gibi durumlar bana baya can sıkıcı gelir ve buna genel bir çözüm bulmak isteriz. İşte burada yardımıza “ApplicationEvents.vb” Class’ı koşar. Bu .vb dosyasının oluşması için aşağıdaki adımları izlemelisiniz..

Projenize sağ tıklayıp “Properties” seçiniz..

Projenize sağ tıklayı Properties seçin.

“Application” sekmesinde “View Application Events” butonuna bastığınızda projenizde “ApplicationEvents.vb” class’ı “Partial” olarak oluşacaktır. Otomatik olarak ekrana gelecektir.

Application Events.vb dosyasının oluşturulması.

Proje içinde Application Events.vb

Bu class açıldığında artık yazının başında anlattığımız sorunlara bir çözüm olacağını umuyoruz. 🙂 Aslında biliyoruz ama çaktırmıyoruz 😉 ApplicationEvents.vb dosyası açıkken kod ekranının “ClassName” ve “MethodName” kısımlarındaki açılır listeyi kullanarak istediğimiz olay da işlem yapabiliriz.

Örneğin test projesinde uygulama başlangıç form’u hangi form seçilirse seçilsin. Login işlemini “MyApplication_Startup” metodu içinde yapabiliriz. Bu metod uygulama başladığında tetiklenir.

image

image

Örnek olarak böyle kodlayabiliriz..

Namespace My
    ' The following events are available for MyApplication:       
    ' Startup: Raised when the application starts, before the startup form is created.    
    ' Shutdown: Raised after all application forms are closed.  This event is not raised if the application terminates abnormally.    
    ' UnhandledException: Raised if the application encounters an unhandled exception.    
    ' StartupNextInstance: Raised when launching a single-instance application and the application is already active.
    ' NetworkAvailabilityChanged: Raised when the network connection is connected or disconnected.    
    Partial Friend Class MyApplication
        '' Uygulama ba?lang?c?nda..        
        Private Sub MyApplication_Startup(ByVal sender As Object, ByVal e As Microsoft.VisualBasic.ApplicationServices.StartupEventArgs) Handles Me.Startup
            '' Login i?lemleri..           
            UserInfo.UserName = "Murat"
            UserInfo.UserSurname = "Ba?eren"
        End Sub
    End Class
End Namespace

Uygulama içinde yönetilmeyen bir hata olduğunda bunu yönetmek içinde bu kısımdaki metodlardan yararlanabiliriz. Yönetilmeyen kod’dan kastımız bir “Try..Catch” yapısı ile kontrol edilmeyen kodlama kısımlarıdır. Onun içinde “MyApplication_UnhandledException” metodu işimizi görecektir.

'' Y?netilmeyen hatalarda..
Private Sub MyApplication_UnhandledException(ByVal sender As Object, ByVal e As Microsoft.VisualBasic.ApplicationServices.UnhandledExceptionEventArgs) Handles Me.UnhandledException
    MessageBox.Show("Hata olu?tu. Kaydedildi.", "Hata Olu?tu.", MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1)
    My.Application.Log.WriteException(e.Exception)
    e.ExitApplication = False
End Sub

Uygulamadan çıkarken bir işlem yapılabileceği gibi diğer metotları da kullanabilirsiniz.

Tabii ki bu işlemlerin Visual Basic tarafıydı. C# ‘ta ApplicationEvents.cs class’ını aramaya kalktığınızda projenizin özellikleri ekranında VB ‘deki gibi bir class’ı oluşturan buton bulamayacaksınız.. Bunun sebebi; C# ‘da o Class’ın zaten oluşmuş olmasıdır. İsmi de “Program.cs” dir.

Yukarıdaki işlemlerin benzerleri C# da aşağıdaki gibi kodlanarak elde edilir.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;

namespace ApplicationEventsCS
{
    static class Program
    {

        [STAThread]
        static void Main() {
            // VB'deki MyApplication_Startup e?leni?i metot budur.            
            // Y?netilmeyen hatalar?n yakalanaca?? olay..            
            Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }

        static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e) {
            MessageBox.Show("Hata olu?tu. Kaydedildi.", "Hata Olu?tu.", MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1);
            Microsoft.VisualBasic.Logging.Log log = new Microsoft.VisualBasic.Logging.Log();
            log.WriteException(e.Exception);
        }
    }
}

“Microsoft.VisualBasic.Logging.Log” sınıfını kullanabilmek için “Microsoft.VisualBasic” referansını projenize eklemeyi unutmayınız..

VB,CS – Baştan Sona Loglama (Logging)

Uygulama geliştirirken ya da geliştirdikten sonra en çok gerek duyduğumuz işlem sağlıklı bir hata loglama yapısıdır. Çünkü bu işlem uygulamayı Test ortamından tutunda canlı ortama kadar ve hatta uygulamanın hayatı boyunca ihtiyaç duyulacak en önemli kısımdır.

Uygulamanın aktardığınız ortamda ilk açılışından kaldırılıncaya kadar her zaman sağlıklı bir hata loglama ile oluşan hataların ve sorunların elinize geçmesi çok önemli ve hayat kurtarıcıdır. Genelde aktarılan ortamda uygulama ilk aktarıldığında biraz nazlı olur 🙂 Tabii bu naz uygulamanın çalışmasını zorlaştırır. 🙂 İşte bu durumlarda sağlıklı bir hata loglama yapısı yoksa hatayı bulmak ölümcül zaman kayıplarına neden olabilir. Hatta genelde öldürür !! 🙂 Aynı za

man da uygulama çalıştığı süre boyunca yani hayatı boyunca kullanıcıların sebep olduğu veya olmadığı her türlü hatanın yakalanması, kaydedilmesi(hata loglama), bilgi kaydedilmesi(loglama), izlenebilmesi vs. Sizi köşeye sıkışacağınız bir anda kurtarıcı bir kapınız olmasını sağlayacaktır. Yoksa kullanıcının makinasındaki uygulamayı debug etmeyi mi düşünüyordunuz.. 🙂 Bir silah alıp kafanıza sıkın daha rahat olur.. :))

Neyse sözü uzatmadan bu işlemlerde elimizde ki silahları sizinle paylaşmak istiyorum. Tabii ki olayımız çok açık ve seçik olarak en az kodla bu işi nasıl yaparız. 🙂 Hatta mümkünse hiç kod yazmasak süper  olmaz mı !? :)) Bence müthiş olur..

Bizi kurtaracak dosyamızın adı; App.config

Bu dosya içinde yapacağımız loglama ayarları ile uygulamamızda bir tek satırda loglama işlemini halledebiliriz. Sadece hata loglama değil, uygulama içinde herhangi bir anda kayıt altına alınmasını istediğimiz verileri bile bu şekilde kaydedebiliriz.

MSDN ‘den araştırdığım sayfalar sonucunda şu şekilde App.config dosyasını düzenledim.

App.config dosyasında ki “configuration” bölümü altında “system.diagnostics” altında “sources” , “switches” , “sharedListeners” kısımlarından oluşmaktadır. Burada “sources” kısmında loglama yapıları kısa bir tanımlama yapılmaktadır. “sharedListeners” kısmında ise “sources” kısmında tanımlanan her “source” için ayrıntılar belirtilmektedir.

VB projelerinde, projemize bir App.config dosyası eklediğimizde, bu kısımlar otomatik olarak oluşmaktadır. Fakat sadece “FileLog” seçeneği gelmektedir. Fakat MSDN araştırmam sonucunda diğerlerini de yazdım.

CS projelerinde, projemize bir App.config dosyası eklediğimizde, bu kısımların hiçbiri ama hiçbiri ama ama hiçbiri gelmiyor. Fakat VB projesinde oluşan kodları aynen kopyalayabilirsiniz..

Her bir loglama yapısını açıklama yazıları ile belirttim. Her bir “sources” için detaylarının olduğu “sharedListeners” alanında “log dosyasının oluşturulacağı konumu” ve diğer ayarlarını görebilir ve değiştirebilirsiniz..

<configuration>
  <system.diagnostics>
    <sources>
      <source name="DefaultSource" switchName="DefaultSwitch">
        <listeners>
          <add name="FileLog"/>
          <add name="EventLog"/>
          <add name="FileLogListener" />
          <add name="Delimited" />
          <add name="XmlWriter" />
          <add name="Console" />
        </listeners>
      </source>
    </sources>

    <switches>
      <add name="DefaultSwitch" value="Information" />
    </switches>

    <sharedListeners>
                       <add name="FileLog" type="Microsoft.VisualBasic.Logging.FileLogTraceListener, Microsoft.VisualBasic, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"initializeData="FileLogWriter"/>

      <add name="EventLog" type="System.Diagnostics.EventLogTraceListener" initializeData="ApplicationEventsVB"/>

                       <add name="FileLogListener" type="Microsoft.VisualBasic.Logging.FileLogTraceListener, Microsoft.VisualBasic, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"initializeData="FileLogListenerWriter" location="Custom" customlocation="C:\VB\\cf0 " />

                       <add name="Delimited" type="System.Diagnostics.DelimitedListTraceListener, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" initializeData="C:\VB\ApplicationEvents.txt" delimiter=";"traceOutputOptions="DateTime" />

      <add name="XmlWriter" type="System.Diagnostics.XmlWriterTraceListener, System, Version=2.0.0.0,                  Culture=neutral, PublicKeyToken=b77a5c561934e089" initializeData="C:\VB\ApplicationEvents.xml" />
      <add name="Console" type="System.Diagnostics.ConsoleTraceListener, System, Version=2.0.0.0,                  Culture=neutral, PublicKeyToken=b77a5c561934e089" initializeData="true" />
    </sharedListeners>
  </system.diagnostics>
</configuration>

Bu loglama seçeneklerinden uygulanmasını istemediklerinizi “açıklama” satırı yapmanız yeterlidir.

Aktif olanların hepsi sırası ile uygulanacaktır..

Bu işlemlerden sonra uygulama kodunuz içinde herhangi bir yerde ki özellikle “Try..Catch” bloğu içinde yada bilgi kaydedilmesini istediğiniz bir yerde aşağıdaki kodu yazarak ve diğer “aşırı yüklenmiş (overload)” versiyonlarına bakarak işlem yapabilirsiniz..

VB Projelerinde;

My.Application.Log” nesnesini kullanarak App.config içinde aktifleştirdiğimiz loglama yapılarının sırasıyla gerçekleşmesini sağlamış oluruz..

My.Application.Log.WriteException(New Exception("Bu bir hata mesaj?d?r.."))
My.Application.Log.WriteEntry("Bu bir bilgi kaydetme i?lemidir..")

CS Projelerinde;

Ufak bir işlem ile aynı nesneyi kullanabiliriz… “App.config” dosyamız VB projesindekinin aynısı olacaktır. Ardından projemize “References” kısmında “Microsoft.VisualBasic” referansını projemize eklememiz yeterlidir.

image

image

image

Bu işlemlerden sonra kodumuz aşağıdaki gibidir..

Microsoft.VisualBasic.Logging.Log log = new Microsoft.VisualBasic.Logging.Log();
log.WriteException(new Exception("Bu bir deneme hatas?d?r."));
log.WriteEntry("Bu bir deneme bilgisidir..");

LOGLAMA ÖRNEKLERİ..

XML Loglama..

<E2ETraceEvent xmlns="http://schemas.microsoft.com/2004/06/E2ETraceEvent">
  <System xmlns="http://schemas.microsoft.com/2004/06/windows/eventlog/system">
    <EventID>0</EventID>
    <Type>3</Type>
    <SubType Name="Information">0</SubType>
    <Level>8</Level>
    <TimeCreated SystemTime="2010-03-28T15:28:24.0563348Z" />
    <Source Name="DefaultSource" />
    <Correlation ActivityID="{00000000-0000-0000-0000-000000000000}" />
    <Execution ProcessName="ApplicationEventsVB.vshost" ProcessID="4216" ThreadID="10" />
    <Channel/>
    <Computer>BILMEMNEPC</Computer>
  </System>
  <ApplicationData>Bu bir test hatas?d?r.</ApplicationData>
</E2ETraceEvent>

Delimited loglama..

"DefaultSource";;;Information;;;0;;;"Deneme99";;;;;;;;;;;;;;;"2010-03-28T15:26:29.0977595Z";;;;;; "DefaultSource" ||| Information ||| 0 ||| "Deneme99" ||| ||| ||| ||| ||| "2010-03-28T15:28:24.0563348Z" ||| |||

Konuyla ilgili MSDN sayfaları;

http://msdn.microsoft.com/en-us/library/5cz98azz(VS.80).aspx
http://msdn.microsoft.com/en-us/library/xbw77c0x(VS.80).aspx
http://msdn.microsoft.com/en-us/library/3tbf1bh0(VS.80).aspx
http://msdn.microsoft.com/en-us/library/7fx0fexe(VS.80).aspx
http://msdn.microsoft.com/en-us/library/f9shkfdd(VS.80).aspx
http://msdn.microsoft.com/en-us/library/12xxftw2(VS.80).aspx

VB – MAC Adresim Nedir?

Bilgisayarın MAC adresini öğrenebileceğiniz kod parçası..
Projenize “System.Managment.dll” referansını eklemeyi unutmayın ! 🙂


Public Function GetMACAddress() As String

    Dim mc As New ManagementClass("Win32_NetworkAdapterConfiguration")

    Dim moc As ManagementObjectCollection = mc.GetInstances()

    Dim MACAddress As String = String.Empty

    For Each mo As ManagementObject In moc

        If MACAddress = String.Empty Then

            ' only return MAC Address from first card

            If CBool(mo("IPEnabled")) = True Then

                MACAddress = mo("MacAddress").ToString()

            End If

        End If

        mo.Dispose()

    Next

 

    ''MACAddress = MACAddress.Replace(":", "")

    Return MACAddress

End Function