Repeater ile verileri listemek yada sıralamaksort mümkün. Peki sıralamasını manuel nasıl yaparız?
Bunu gerçekleştirmek için taşıma yapmak istediğimiz tablomuza RowNumber adlı bir kolonfield ekliyoruz. Bu kolondaki değer verinin sıra numarasını temsil edecek. Taşıma işlemi ise bu numaraları değiştirmekten ibaret olacaktır.
Repeater içine sıralama olayını gerçekleştirmek için iki adet ImageButton kontrolü ekliyoruz. CommandArgument özelliğineproperty taşınacak satırın Id değerini atıyoruzset. CommandName özelliğine atanan up ve down değerleri ile de taşıma yönünü bildiriyoruz.
<td style="width: 24px; text-align: center;"> <asp:ImageButton runat="server" ID="moveup" ImageUrl="~/Images/up.png" ToolTip="Yukarı Taşı" CommandArgument='<%# Eval("Id")%>' CommandName="up" /> </td> <td style="width: 24px; text-align: center;"> <asp:ImageButton runat="server" ID="movedown" ImageUrl="~/Images/down.png" ToolTip="Aşağı Taşı" CommandArgument='<%# Eval("Id")%>' CommandName="down" /> </td>
Repeater kontrolünün ItemCommand olayıevent na aşağıdaki kodları yazarak taşıma işlemini gerçekleştiriyoruz.
using (NorthwindDataContext db = new NorthwindDataContext()) { //taşınacak verinin Id bilgisi alınıyor Guid Id = new Guid(e.CommandArgument.ToString()); //taşınacak veri OrderedProduct moveproduct = db. OrderedProducts. FirstOrDefault(p => p.Id == Id); //yeni numara hesapla int RowNumber = e.CommandName == "up" ? moveproduct.RowNumber - 1 : //yukarı ise moveproduct.RowNumber + 1; //aşağı ise //yeri değişecek veri OrderedProduct targetproduct = db. OrderedProducts. FirstOrDefault(p => p.RowNumber == RowNumber); if (e.CommandName == "up") { //yukarı taşı moveproduct.RowNumber -= 1; targetproduct.RowNumber += 1; } else if (e.CommandName == "down") { //aşağo taşı moveproduct.RowNumber += 1; targetproduct.RowNumber -= 1; } //değişiklikleri yap db.SubmitChanges(); } //tekrar listele BindData();
Daha sonra ise, ilk satırdaki Yukarı Ok u ve en alt satırdaki Aşağı Ok ImageButton'larını basit bir script kodu ile kaldırıyoruz. Bu kod sayesinde sunucuserver tarafındaki ilk kayıt mı son kayıt mı kontrolünü yapmaktan yırtıyoruz :)
<script src="Scripts/jquery-1.4.1-vsdoc.js" type="text/javascript"></script> <script type="text/javascript"> $(document).ready(function () { $("table tbody tr:first td:eq(3)").empty(); $("table tbody tr:last td:eq(4)").empty(); }); </script>
Repeater kontrolü renderHtml koduna dönüşmek edildiğinde aşağıdaki görüntü oluşacaktır. Kullanıcı yukarı aşağı ok tuşları ile satırları manuel olarak sıralayabilecek.
Projeyi indir.
Pivot hazırlamak benim için hep eziyet olmuştur (Sql ile). Lakin Linq ile çok daha basitmiş onu kavradım :)
Şöyleki; Diagramda görüldüğü gibi bir yapı olsun. Yazılar ve Kategoriler adlı iki adet ana tablo ve bunları bağlayan bir adet yardımcı tablo.
Amacımız; Kategori bazında 2010 yılında aylık kaç adet yazı yayınlanmış onu bulmak ve listelemek.
from p in db.EntryCategories where p.Entry.EntryTime.Year == 2010 group p by p.Category.CategoryName into g select new { Kategori = g.Key, Ocak = g.Where(t => t.Entry.EntryTime.Month == 1).Count(), Şubat = g.Where(t => t.Entry.EntryTime.Month == 2).Count(), Mart = g.Where(t => t.Entry.EntryTime.Month == 3).Count(), Nisan = g.Where(t => t.Entry.EntryTime.Month == 4).Count(), Mayıs = g.Where(t => t.Entry.EntryTime.Month == 5).Count(), Haziran = g.Where(t => t.Entry.EntryTime.Month == 6).Count(), Temmuz = g.Where(t => t.Entry.EntryTime.Month == 7).Count(), Ağustos = g.Where(t => t.Entry.EntryTime.Month == 8).Count(), Eylül = g.Where(t => t.Entry.EntryTime.Month == 9).Count(), Ekim = g.Where(t => t.Entry.EntryTime.Month == 10).Count(), Kasım = g.Where(t => t.Entry.EntryTime.Month == 11).Count(), Aralık = g.Where(t => t.Entry.EntryTime.Month == 12).Count(), };
Sonuç;
Çok yakın ve kadim bir dostum için araştırırken farkettim ve paylaşmak istedim. ListView kontrolü içinde ki verileri gruplayarak göstermek. DataList kontrolündeki RepeatColums özelliğini kullanmak gibi fakat birazcık farklı :)
Div etiketleriyle Listview'e şablon hazırlamak yeterli.
<asp:ListView ID="Listview1" runat="server" GroupltemCount="S" EnableViewState="false"> <ItemTemplate> <div style="width: 200px; float: left; font-family: Verdana; font-size: l0px; margin-bottom: l0px;"> <asp:Image ID="Imagel" runat="server" ImageUrl='<%# "image.aspx?path=" + Eval("FullName") %>' /> <br /> <strong>Dosya Adi:</strong> <%# Eval("Name")%> <br /> <strong>Uzunluk: </strong> <%# Eval("Length")%> <br /> <strong>Özellikler : </strong> <%# Eval("Attributes")%> </div> </ItemTemplate> <LayoutTemplate> <div id="groupPlaceholderContainer" runat="server"> <div id="groupPlaceholder" runat="server"> </div> </div> </LayoutTemplate> <GroupTemplate> <div id="itemplaceholdertontainer" runat="server" style="width: l000px;"> <div id="itemPlaceholder" runat="server"> </div> </div> </GroupTemplate> </asp:ListView>
Veri kaynağı için basit ve hızlı bir çözüm, dosyalar.
Listview1.DataSource = from file in new DirectoryInfo("C:\\windows").GetFiles() orderby file.Name select new { file.Name, file.Length, file.FullName, file.Attributes }; Listview1.DataBind();
Dosyaları biraz süslü gösterelim.
string path = Request["path"]; Icon ico = Icon.ExtractAssociatedIcon(path); Bitmap bmp = new Bitmap(ico.Width, ico.Height); Graphics g = Graphics.FromImage(bmp); g.DrawIcon(ico, new Rectangle(0, 0, ico.Width, ico.Height)); bmp.Save(Response.OutputStream, ImageFormat.Png); g.Dispose(); bmp.Dispose(); ico.Dispose();
Şöyle bir düşündüğümüzde veritabınında bulunan herhangi bir tablonun verilerini Xml formatında dosyaya yazmanın kaç yolu vardır acaba? Sabahları genelde işe erken gelirim, 1.5 saat kadar :). Oturdum bir kaç örnek yaptım, paylaşıyorum tüm dünya ile. (Özgüvenin tavan yaptığı an) Aklıma gelen ilk yöntem DataTable nesnesini kullanmak. Bu nesneyi sadece yazmak için kullanmak kaynak tüketimi açısından çok iyi bir seçim olmaz fakat kullanım kolaylığı açısında tercih edilebilir.
Diğer bir yöntem ise henüz Veri KatmanındaDataLayer iken oracıkta Xml formatına dönüştürüp XmlTextWriter ile cayır cayır yazmak.
Son yöntem ise daha önce şu yazıda kullandığım teknik ile (attributenitelik yerine bu sefer nodedüğüm kullandım) XDocument ile manuel olarak Xml dosyasını oluşturmak. Sanırım en zoru bu. Yanlış anlaşılmasın benim için kolay da hani ilk yapan için diyorum :)
Yerel Pc' nin Versiyon 4 Ip adresini almak.
LinqToXml ile Xml dosyası oluşturup Treeview kontrolü ile gösterelim;