ASP.NET 4.0 Yenilikleri – QueryExtender

Bu makalemizde daha önce yayınladığımız ASP.NET 4.0 Yenilikleri makalesine devam ediyor ve başka bir yenilik olan QueryExtender‘ı incelemeye çalışıyoruz.

Elbetteki yaşam çalışmak ve para kazanmakla sınırlı değil! Müziğe de zaman ayırmalı! Barış Abi’nin “Anlıyorsun değil mi?” şarkısıyla başlayalım istedim. 🙂

QueryExtender

Benim Sorgu Genişletici ya da Sorgulayıcı olarak Türkçeleştirdiğim bu nesne System.Web.UI.WebControls isim uzayında yer alıyor. Assembly’si ise System.Web.Extensions.dll’dir. ‘Control’ nesnesinden türetilen bu nesne, veri tabanındaki bir bilgiyi kolayca filtrelememizi sağlıyor. Söz dizimi aşağıdaki gibidir:

<asp:QueryExtender />

Linq ve Entity veri kaynakları (DataSource) üzerinde de filtrleme yapabilen QueryExtender, 8 farklı filtreleme seçeneğine sahiptir:

ControlFilterExpression, System.Web.DynamicData kütüphanesinde yer alır ve DataSourceExpression sınıfından türemiştir. Veri kaynakları birbirine bağlanmış (dinamik veriler için) ListView ve GridView kontrollerinin üzerinde süzme işlemi yapılmasını sağlar. Kaynak kontrol’de yapılan süzme işlemi, hedef kontrol için de geçerli olur ve hatta kaynaktaki süzülen kayıtla ilgili satıra seçilm yapılmasını sağlayabiliriz.

Örnek kullanım:

<asp:QueryExtender ID="QueryExtenderID"
	TargetControlID="TargetDataSourceID" runat="server">
	<asp:ControlFilterExpression ControlID="SourceGridViewID" /> 
</asp:QueryExtender>  

TargetControlID, veri kaynağını (Data Source) tutuyor.

CustomExpression, LINQ sorguları üzerinde süzme (filtreleme) işlemi yapan Expression’dır. System.Web.Extensions kütüphanesinde yer alır ve ParameterDataSourceExpression sınıfından türetilmiştir.

Örnek kullanım:

    <asp:LinqDataSource ID="LinqDataSource1" runat="server" 
        ContextTypeName="AdventureWorksDataContext" EntityTypeName="" 
        TableName="Products">
    </asp:LinqDataSource>

    <asp:QueryExtender ID="QueryExtender1" runat="server" TargetControlID=
"LinqDataSource1">
        <asp:CustomExpression OnQuerying="FilterProducts"></asp:CustomExpression>
    </asp:QueryExtender>

    <asp:GridView ID="GridView1" runat="server"  
        DataSourceID="LinqDataSource1"   
        DataKeyNames="ProductID"  AllowPaging="True">
    </asp:GridView>

Bir LinqDataSource, bir QueryExtender, bir de GridView ekledik. GridView’in DataSourceID’sini LinqDataSource olarak gösterdik ve QueryExtender‘in OnQuerying özelliğini ürünler üzerinde süzme yapması için ayarladık.

Şimdi de C# kısmına geçip şu kodları inceleyelim:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.Expressions;
using System.Linq;

public partial class _Default : System.Web.UI.Page
{
protected void FilterProducts(object sender, CustomExpressionEventArgs e)
{
e.Query = from p in e.Query.Cast<Product>()
where p.ListPrice >= 3500
select p;

}
}

Hemen dikkatimizi çeken FilterProducts olmalıdır çünkü OnQuerying özelliğine atadığımız değer için bu kodları yazdık.Ürün fitatı 3500’ün üzerinde olan ürünler listenecektir. ‘e.Query‘ ile ulaşılan sorguyu QueryExtender sağlamaktadır.

DynamicFilterExpression, ASP.NET Dynamic Data web sitelerinde QueryExtender üzerinden süzme işlemi yapmak için kullanılır. System.Web.DynamicData.dll kütüphanesinde bulunan ve DataSourceExpression sınıfından türetilmiştir.

Örnek kullanımı:

<asp:QueryExtender ID="QueryExtender1" 
     TargetControlID="GridDataSource" runat="server">
    <asp:DynamicFilterExpression ControlID="CategoryFilterID" />
</asp:QueryExtender>

MethodExpression, Bir LINQ sorgusu üzerinden arama işlemi yapmak için kullanılır.System.Web.UI.WebControls.Expressions isim uzayında bulunur, System.Web.Extensions.dll kütüphanesinde yer alır ve ParameterDataSourceExpression sınıfından türetilmiştir.

Kullanacağı LINQ sorgusu şu kurallara uymak durumundadır:

İlk parametre IQueryable<T> ya da IEnumerable<T> türünden olmalıdır. Static olan bu metod birden fazla parametre alabilmektedir.

Geri döndürülen (return) değer IQueryable<T> ya da IEnumerable<T> türünden farklı bir türe dönüştürülerek gönderilemez.

Şimdi ASPX ve C# kodlarımıza bakalım:

 <asp:LinqDataSource ID="LinqDataSource1" runat="server" 
        ContextTypeName="AdventureworksDataContext" EntityTypeName="" 
        TableName="Products">
    </asp:LinqDataSource>
    
    <asp:QueryExtender ID="QueryExtender2" runat="server" 
        TargetControlID="LinqDataSource1">
      <asp:MethodExpression MethodName="FilterStandardPrice" >
      </asp:MethodExpression>
    </asp:QueryExtender>

    <asp:GridView ID="GridView1" runat="server" 
        DataSourceID="LinqDataSource1" 
        DataKeyNames="ProductID" 
    </asp:GridView>

QueryExtender‘ımızın içindeki MethodName FilterStandartPrice olarak ayarlanmış. Şimdi gelelim metodumuza:

        public static IQueryable<Product> 
        FilterStandardPrice(IQueryable<Product> query)
	 	 {
        return from p in query
                  where p.ListPrice >= 400
                  select p;
        }

FilterStandartPrice metodumuz IQueryable türünden bir parametre alıyor ve geri döndürüyor (return). Ürün fiyatı 400’e eşit ve 400’ün üstünde olan ürünler listelenecektir.

OrderByExpression, adından da anlaşılabileceği üzere sıralama işini yapar. SQL’deki order by’a eşdeğer olan bu Expression, System.Web.UI.WebControls.Expressions isim uzayında, System.Web.Extensions.dll kütüphanesinde yer alır ve DataSourceExpression sınıfından türetilmiştir. Tıpki SQL’de olduğu gibi artan veya azalan sıralama yapabilir. Sözü fazla uzatıp konuyu boğmadan örneğimizi inceleyelim:

 Ara<asp:TextBox ID="txtAra" runat="server" />

    <asp:Button ID="btnAra" runat="server" Text="Ara"  /> 

  <asp:LinqDataSource ID="LinqDataSource1"  
      ContextTypeName="AdventureWorksDataContext"  
      TableName="Products" runat="server"> 
  </asp:LinqDataSource>

  <asp:QueryExtender ID="QueryExtender1" runat="server" TargetControlID=
"LinqDataSource1">
    <asp:SearchExpression SearchType="StartsWith" DataFields="Name" >
      <asp:ControlParameter ControlID="txtAra" />
    </asp:SearchExpression>
    <asp:OrderByExpression DataField="ListPrice" 
        Direction="Descending">
      <asp:ThenBy DataField="ProductID" Direction="Ascending"/>
    </asp:OrderByExpression>
  </asp:QueryExtender>

  <asp:GridView ID="GridView1" runat="server"  
      DataSourceID="LinqDataSource1" AllowPaging="True" >
  </asp:GridView>

<asp:SearchExpression SearchType=”StartsWith” DataFields=”Name” >

Satırında SeacrhType=”StartsWith” olarak belirtilen özellik,”girilen değerle başlayanlar listelensin” şeklinde yorumlanabilir.

<asp:OrderByExpression DataField=”ListPrice”
Direction=”Descending”>

Satırında DataField özelliğiyle belirtilen alan, sıralanacak alanı belirliyor. Direction ise artan mı azalan mı olacağına karar veriyor.

PropertyExpression, SQL’den alışık olduğumuz WHERE parametrelerinin taşıyıcısıdır. System.Web.UI.WebControls.Expressions isim uzayında yer alır, System.Web.Extensions.dll kütüphanesinde tutulur ve ParameterDataSourceExpression sınıfından türetilmiştir. Daha çok karşılaştırma \ doğrulama işlemleriyle açıklanan bu Expression’ını tanımaya çalışalım:

LINQ sorgularını desteklemekle birlikte, sorgu sonucu bir GridView’da görüntülenir. InvalidOperationException isimli SystemException‘dan türemiş bir hata yakalayıcısı vardır. DataField‘in null olması durumuna karşı yaratılmıştır. Bool olan değerler direk CheckBox’lar tarafında görüntülenir.

  Daha fazlasını yap! <asp:CheckBox ID="MakeCheckBox" runat="server" />

  <asp:LinqDataSource ID="LinqDataSource1"  
      ContextTypeName="FilterDemo.AdventureWorksDataContext"  
      TableName="Products" runat="server"> 
  </asp:LinqDataSource>

  <asp:QueryExtender ID="QueryExtender1" runat="server"    
      TargetControlID="LinqDataSource1">
    <asp:PropertyExpression>
      <asp:ControlParameter ControlID="MakeCheckBox" Name="MakeFlag" />
    </asp:PropertyExpression>
  </asp:QueryExtender>

  <asp:GridView ID="GridView1" runat="server"  
      DataSourceID="LinqDataSource1" AllowPaging="True"    
      DataKeyNames="ProductID>
  </asp:GridView>

ControlParameter’in özelliği olan ControlID, MakeCheckBox isimli CheckBox’ın seçilip seçilmemesi durumuna göre süzme işlemi gerçekleştiriyor.

RangeExpression, bir değerin olup olmadığını, karşılaştırılan değerden büyük olup olmadığını, karşılaştırılan değerlerin arasında olup olmadığı gibi SQL’den hatırladığımız 5>10, between gibi

özelliklerin taşıyısıcıdır. System.Web.UI.WebControls.Expressions isim uzayında, System.Web.Extensions.dll kütüphanesinde tutulur ve ParameterDataSourceExpression sınıfından türetilmiştir.

InvalidOperationException isimli SystemException‘dan türemiş bir hata yakalayıcısı vardır. DataField’in null olması durumuna karşı yaratılmıştır.

    <asp:TextBox ID="txtNereden" runat="server"></asp:TextBox>
    <asp:TextBox ID="txtNereye" runat="server"></asp:TextBox>
    <asp:Button ID="btn1" runat="server" Text="Button" />

    <asp:LinqDataSource ID="LinqDataSource1" 
        ContextTypeName=" FilterDemo.AdventureworksDataContext"  
        runat="server" TableName="Products">
    </asp:LinqDataSource>

    <asp:QueryExtender ID="QueryExtender1" runat="server"  
        TargetControlID="LinqDataSource1">

    <asp:RangeExpression DataField="ListPrice"  
        MinType="Inclusive" MaxType="Exclusive">
    <asp:ControlParameter ControlID="txtNereden" />
    <asp:ControlParameter ControlID="txtNereye" />
    </asp:RangeExpression>
</asp:QueryExtender>

<asp:GridView ID="GridView1" runat="server"    
    DataSourceID="LinqDataSource1" AllowPaging="True" >
</asp:GridView>

Nereden ve Nereye isimli textBox’ları parametre olarak alan RangeExpression, Maksimum değer dışında (Exlusive) ListPrice üzerinde bir karşılaştırma yapar. İki değer arasındaki farklar ekrana getirilir.

SearchExpression, yapılacak aramanın tipini belirleme işleminde kullanılır. Daha önce OrderByExpression‘da değindiğimiz bu Expression’ı biraz daha yakından tanımaya çalışalım. System.Web.UI.WebControls.Expressions isim uzayındadır. System.Web.Extensions.dll kütüphanesinde tutulur ve ParameterDataSourceExpression sınıfından türetilmiştir. DataField özelliğinin null olma durumuna karşı InvalidOperationException hata yakalayıcısı vardır. Diğer Expression’lardan farklı olarak yalnızca C#’da çalışmaktadır. VB.NET desteği yoktur.

SearchExpression‘ın üç farklı SearchType‘ı vardır:

  1. StartsWith, OrderByExpression‘da açıkladığımız gibi; girilen değerle başlayan verileri listeler.
  2. Contains, girilen değeri içeren verileri listeler.
  3. Ends with ise girilen değerle biten verileri listeler.

Şimdi kodlarına göz atalım ve daha iyi anlamaya çalışalım:

 Ara: <asp:TextBox ID="txtAra" runat="server" />
  <div>
  <asp:Button ID="Button1" runat="server" Text="Search"  />
  </div>

  <asp:LinqDataSource ID="LinqDataSource1"  
       ContextTypeName="AdventureWorksDataContext"  
       TableName="Products" runat="server"> 
  </asp:LinqDataSource>

  <asp:QueryExtender ID="QueryExtender1" runat="server" 
       TargetControlID="LinqDataSource1">
    <asp:SearchExpression SearchType="StartsWith" DataFields="Name" >
      <asp:ControlParameter ControlID="txtAra" />
    </asp:SearchExpression>
  </asp:QueryExtender>

  <asp:GridView ID="GridView1" runat="server"  
      DataSourceID="LinqDataSource1" AllowPaging="True" >
  </asp:GridView>

SearchExpression etiketleri arasında yer alan “SearchType” özelliğine ‘StartsWith‘ değeri, yani “girilen değerle başlayan verileri listele” değeri atanmış. Bu süzme işleminin ‘Name’ alanında yapılacağı ve txtAra isimli textBox’ın içindeki değerin baz alınacağı belirtilmiş. Bu kodlarımızı da yorumladıktan sonra neleri incelemeye çalıştık kısaca tekrar tanımlayıp sona yaklaşalım:

Expression Adı
Tanımı
ControlFilterExpression Dinamik bir veriye bağlı olarak aranan kelimenin,

arandığı kontrolde seçilmesini sağlar.

CustomExpression LINQ sorguları üzerinde süzme işlemi

yapılmasını sağlar.

DymanicFilterExpression Dinamik veri kaynakları üzerinde süzme işlemi

yapılmasını sağlar.

MethodExpression LINQ veri kaynakları üzerinde süzme işlemi

yapılmasını sağlar.

OrderByExpression İstenen veri kaynağı üzerinde sıralama işlemi

yapılmasını sağlar.

PropertyExpression SQL’deki WHERE kelimesinin taşıyıcısı olarak tanımlayabilir.

Karşılaştırma vb. sorgu işlemlerini yapar.

RangeExpression Between, büyük mü küçük mü gibi süzme işlemlerinin

yapılmasını sağlar.

SearchExpression Aranacak verinin başında mı, içinde mi, sonunda mı

olacağının belirlenmesini sağlar.

Kaynakça

MSDN

ASP.NET

Umarım yararlı olabilmişimdir.

Hoşçakalın.

ASP.NET 4.0 Yenilikleri

ASP.NET 4.0 Web Form Yenilikleri

Bu makalemizde ASP.NET 4.0’la birlikte gelen Web Form yeniliklerini öğrenmeye çalışacağız.

ASP.NET’in her bir yeniliği (release oluşu), ASP.NET’i kullanarak web programlayan herkese çağrıda bulunuyor. (Deyim yerindeyse “ateş bizi çağırıyor.”) Yeniliklerin öğrenilmesi ve uygulanmaya başlanması eksik ya da gereksinim olarak görülmüş ve bu sebeplerden ortaya çıkmış yenilikler olduğundan en azından bir kez göz atıp kendi projelerimizde kullanıp kullanmayacağımız ya da kullanmamızı gerektirdiği alanları ölçüp tartmamızı sağlayacağından göz ardı edilmemeli diye düşünüyorum.

Ve 12 Nisan 2010 itibariyle görücüye çıkan ASP.NET 4.0 özellikle MVC kullanacaklar için çok büyük kolaylıklar sağlıyor. Elbette ki klasik Web Formlarına verdiği desteği esirgemiyor. İncelemeye çalışalım:

  • Page sınıfına Meta etiketleri eklendi,
  • Sayfa Görünümü için daha fazla denetim(control) eklendi,
  • Tarayıcıların kullanımı için kolaylıklar getirildi,
  • Yönlendirme işlemleri için yeni metodlar eklendi (bunun için Sem GÖKSU’nun makalesine bakabilirsiniz: ASP.NET 4.0 ile URL Routing),
  • HTML kodlarının da artık ID’lerle temsil edilebiliyor olması (bunun için Daron Yöndem’in makalesi okunabilir: ClientMode),
  • Persisting adı verilen ve DataControllerin seçilen satırına dayalı işlem yapmayı sağlayan özellik eklendi,
  • ASP.NET Chart Control’üyle ilgili yenilikler eklendi,
  • Arama ve filtreleme işlemlerini kolaylaştırmak için QueryExtender controlü eklendi.(Bu özellik daha sonra incelenecektir.)

Yenilikleri maddeledikten sonra tek tek özetlemeye çalışalım:

Meta etiketleri

ASP.NET 4.0’la birlikte Page sınıfına iki yeni özellik eklendi: MetaKeywords ve MetaDecription. Bu özellikler hem <head> etiketlerinin altında hem de Page direktiflerinin (@) altında kullanabilmektedir.

<head ID=”hd1″ runat=”server”>

<title>Meta Etiketleri</title>

<meta name=”keywords” content=”Keywordler” />

<meta name=”description” content=”sayfa açıklaması” /> </head>

Bu şekilde kullanılabilmesinin yanında daha önce belirttiğimiz gibi Page direktifleriyle de beraber çalışabilmektedir:

<%@ Page Language="C#" AutoEventWireup="true"
CodeFile="Default.aspx.cs"
 Inherits="_Default"
 Keywords="Keywordler"     

Description="sayfa açıklaması" %> 

name="keywords" ile yapılan işlem Page.MetaKeywords,
 name="description kodlarıyla yapılan işlem Page.MetaDescription özellikleriyle eşleşir.

Content’lerin içine yazdığımız değerler, başta Google olmak üzere arama motorlarının ilgisini çeker. 🙂

Sayfa Görünümü İçin Eklenen Yenilik (ViewStateMode)

ASP.NET 4.0’la birlikte gelen yeniliklerden biri de ViewStateMode özelliği. Enabled, Disabled ve Inherit değerlerini alabilen bu özellik, sayfa PostBack (sunucuya gidip geldiğinde) olduğunda bile ViewStateMode içindeki değeri tutabilmesi özellikle görünmesini istemediğimiz ya da performans açısından ikinci, üçüncü kez çalıştığında başımızı ağrıtan dertlerden bizi kurtarıyor.

Bu özelliğin diğer güzel bir yanıysa, Control’ün bulunduğu Panel \ PlaceHolder ya da X çerçevenin ViewStateMode’u Disable’ken içinde tuttuğu nesnenin kendine özgü bir ViewState’ni tutuyor olması. Bununla ilgili küçük bir örnek:

   <form id="form1" runat="server"> 
  <script runat="server"> 
      protected override void OnLoad(EventArgs e) { 
      if (!IsPostBack) { 
        lbl1.Text = lbl2.Text = "Dinamik Değer"; 
      } 
      base.OnLoad(e); 
    } 
  </script> 
  <asp:PlaceHolder ID="PlaceHolder1" runat="server" ViewStateMode="Disabled"> 
      Disabled: <asp:Label ID="lbl1" runat="server" Text="Hobaa" /><br /> 
    <asp:PlaceHolder ID="PlaceHolder2" runat="server" ViewStateMode="Enabled"> 
        Enabled: <asp:Label ID="lbl2" runat="server" Text="Hobaa" /> 
    </asp:PlaceHolder> 
  </asp:PlaceHolder> 
  <asp:button ID="Button1" runat="server" Text="Git Gel" onclick="Button1_Click" /> 
  </form>

   

PlaceHolder1’in ViewStateMode’u Disabled, PlaceHolder2’in ViewStateMode’u Enabled durumda ve ikisinin de Text’i “İlk değer”. Sayfayı tarayıcıda görüntülediğimizde karşımıza iki Label gelecek ve çıktısı aşağıdaki gibi olacaktır:

Git Gel isimli Buttonumuza tıkladığımızda çıkan sonuca bakalım:

Bu konuyla ilgili yine Daron Yöndem’in makalesini inceleyebilirsiniz: ASP.NET 4.0’da full ViewState kontrolü!

Tarayıcı Kolaylıkları

Tarayıcı kolaylıkları, tarayıcıdan tarayıcıya değişen Java Script özellikleri, desteklenmeyen kodlar ya da benzeri sorunlar için getirilen kolaylıklardır. Cep telefonları da düşünülerek geliştirilen bu özelliklerin neleri desteklediğine bakalım:

  • blackberry.browser
  • chrome.browser
  • Default.browser
  • firefox.browser
  • gateway.browser
  • generic.browser
  • ie.browser
  • iemobile.browser
  • iphone.browser
  • opera.browser
  • safari.browser

Bu dosyalar C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\Browsers altında tutulurlar.

HttpBrowserCapabilities nesnesiyle temsil edilen bu yetenekler, System.Web.dll kütüphanesinden çağırılr ve HttpCapabilitiesBase sınıfından türetilmiştir. Örneğin web sayfasının açıldığı client’a ait bilgileri bulalım ve ekrana yazdıralım:

System.Web.HttpBrowserCapabilities browser = Request.Browser;
string s = "Browser Capabilities\n"
+ "Type = " + browser.Type + "\n"
+ "Name = " + browser.Browser + "\n"
+ "Version = " + browser.Version + "\n"          

+ "Major Version = " + browser.MajorVersion + "\n"
+ "Minor Version = " + browser.MinorVersion + "\n"
+ "Platform = " + browser.Platform + "\n"         

+ "Is Beta = "  + browser.Beta + "\n"
+ "Is Crawler = " + browser.Crawler + "\n"
+ "Is AOL = " + browser.AOL + "\n" 

+ "Is Win16 = " + browser.Win16 + "\n"
+ "Is Win32 = " + browser.Win32 + "\n"
+ "Supports Frames = " + browser.Frames + "\n"

+ "Supports Tables = " + browser.Tables + "\n"
+ "Supports Cookies = " + browser.Cookies + "\n"
+ "Supports VBScript = " + browser.VBScript + "\n" 

+ "Supports JavaScript = " + browser.EcmaScriptVersion.ToString() + "\n"
+ "Supports Java Applets = " + browser.JavaApplets + "\n"
+ "Supports ActiveX Controls = " + browser.ActiveXControls  + "\n";
TextBox1.Text = s;  

Bu kodlar yardımıyla HttpBrowserCapabilities’den türetilen browser nesnesi client’a ait tüm bilgileri getiriyor.

Mobile tarayıcılar için System.Web.Mobile.dll’inde MobileCapabilities sınıfı bulunuyor. HttpBrowserCapabilities sınıfından türetilen bu sınıf, mobile tarayıcının desteklediği html \ wml gibi teknolojileri bulup ona göre hareket etmemizi sağlayabiliyor.

Persisting

Persisting özelliği, şimdilik GridView ve ListView nesnelerinde EnabledPersistSelection olarak eklenmiştir. Bir satırın seçilmesine olanak sağlayan ve sunucuya gidip geldiğinde bile (PostBack) seçili satırın kalmasını sağlayan ve üzerinde işlem yapmaya olanak sağlayan bu yenilik System.Activities.Statements isim uzayında yer alıyor ve NativeActivity sınıfından türetilmiştir. Kullanımı aşağıdaki gibidir:

<asp:GridView id="gridPersist" runat="server" EnablePersistedSelection="true">
</asp:GridView>   

Çalıştığı platformlarsa; Windows 7, Windows Vista, Windows XP SP3, Windows Server 2008, Windows Server 2003.

ASP.NET 4.0 Chart

ASP.NET 4.0’da Chart kotrole eklenen özelliklere bakıldığında ona kıyak geçildiği söylenebilir. 🙂 Hemen eklenen yeniliklere bakalım:

(resim asp.net’ten alıntıdır.)

35 yeni grafik türü,

Sınırsız sayıda grafik alanı, başlık, açıklama ve gösterge,

3 boyutlu grafik türleri desteği,

Yeni çubuklar, derecelendirmeler ve logaritmik ölçeklendirmeler,

50’den fazla finansal formül,

Basitleştirilmiş veri bağlama özelliği,

Genel olarak kullanılan standart tarih, saat ve para formatları desteği,

Olaylar için AJAX desteği,

Durum yönetimi.

Chart kontrolleriyle ilgili Microsoft Belgelerine şu adresten ulaşabilirsiniz: Microsoft Chart Controls for .NET Framework Documentation

Şimdi basit bir 3 boyutlu grafik yaratalım (bu örnek ASP.NET web sitesinden alıntıdır.):

  <asp:ChartArea Name="ChartArea1"> 
  <area3dstyle 
      Rotation="10" 
      Perspective="10" 
      Enable3D="True" 
      Inclination="15" 
      IsRightAngleAxes="False" 
      WallWidth="0" 
      IsClustered="False" />       

</asp:ChartArea> 

Bu grafiğin çıktısı aşağıdaki gibi olacaktır:

Umarım yararlı olur.

Hoşçakalın.

Kaynakça

http://www.asp.net/learn/whitepapers/aspnet4

http://weblogs.asp.net/scottgu/archive/2008/11/24/new-asp-net-charting-control-lt-asp-chart-runat-quot-server-quot-gt.aspx

http://www.asp.net/aspnet-4/videos/aspnet-4-quick-hit-persistent-gridview-row-selection

%d blogcu bunu beğendi: