10 parmağında 10 marifet olan süper web tasarımcısı Erbuğ Kaya‘nın ilk romanını uzun zamandır bekliyorduk ve bugün Kasım ayında kitapçılarda olacağı haberini aldık.

Kitabın adı Giddar ve Erbuğ’un 1997 yılından beri tasarladığı, 2002 yılında da yazmaya başladığı fantastik bir roman. Kitabın web sitesini de tabii ki Erbuğ yapmış :)

Hayırlı olsun Erbuğ:)

Merak edenler için: Giddar

Visual Studio 2010 Beta 2 MSDN aboneleri için download’a açıldı. Aşağıdaki link’ten indirilebilir:

http://go.microsoft.com/fwlink/?LinkID=151797

Uygulamalarımızda sıklıkla kullandığımız ComboBox kontrolüne otomatik tamamlama özelliği kazandırmak için AutoCompleteMode property’sine None değerinden farklı bir değer ve ardından da AutoCompleteSource property’sine otomatik olarak tamamlanacak verileri kaynak olarak atamamız gerekir. Aşağıdaki formda görülen combobox’ta AutoCompleteSource property’sinin value’sunu “FileSystem” olarak set ettim ve çok basit bir şekilde bilgisayar dizinlerini görüntüleyebildim:

AutoCompleteSource property’sine CustomSource değerini atarsanız aşağıdaki kodda olduğu gibi bir string collection içinde otomatik tamamlama işlemini yapabilirsiniz:

            AutoCompleteStringCollection a = new AutoCompleteStringCollection();
            a.Add("isil");
            a.Add("beril");
            a.Add("nurten");
            a.Add("io");

            comboBox1.AutoCompleteCustomSource = a;

Daha detaylı bilgiye http://msdn.microsoft.com/en-us/library/system.windows.forms.combobox.autocompletemode.aspx adresinden erişebilirsiniz.

LINQ ile ForEach’i oluşturduğumuz bir List’in içinde aşağıdaki gibi kullanabiliriz:

 class Program
    {
        static void Main(string[] args)
        {
            List<int> lst = new List<int>();
            lst.Add(1);
            lst.Add(11);
            lst.Add(12);
            lst.Add(13);
            lst.Add(5);

            (from l in lst where l > 3 select l).ToList().ForEach(i => Console.WriteLine(i * 2));

            Console.Read();
        }
    }

Kodda oluşturduğumuz List’in item’larından 3′ten büyük olanları ToList metoduyla yeniden bir List’e attık. Ardından da ForEach ile bu List’teki item’ların herbirini 2 ile carpıp ekrana yazdırdık. Tek satırda:)

Bugünlerde bir web sitesi yapmaya başladım. Admin tarafını da çok hatta hiç :) uğraşmadan ASP.Net Dynamic Data Entities Web Application olarak yaptım. Siteyi yaparken karşılaştığım bir durumu ve çözümünü de sizlerle paylaşmak istiyorum.

Admin tarafında kullanıcı yeni bir ürün eklemek istediğinde sayfa aşağıdaki gibi açılıyordu:

Identity alan olan ProductId alanı da kullanıcının dolduracağı diğer alanlar gibi formda görüntüleniyordu. Ancak bu alanın görüntülenmemesi, değerinin de kullanıcı ürün eklediğinde otomatik olarak atanması gerekiyordu. Bunun için otomatik olarak oluşturulan model’in designer.cs dosyasında ProductId property’sine [ScaffoldColumn(false)] attribute’ini eklemek gerekiyor:

   [global::System.Data.Objects.DataClasses.
EdmEntityTypeAttribute(NamespaceName="MyModel", Name="Products")]
    [global::System.Runtime.Serialization.
DataContractAttribute(IsReference=true)]
    [global::System.Serializable()]
    public partial class Products : global::System.Data.Objects.DataClasses.EntityObject
    {
        /// <summary>
        /// Create a new Products object.
        /// </summary>
        /// <param name="productId">Initial value of ProductId.</param>
        /// <param name="productNameTurkish">Initial value of ProductNameTurkish.</param>
        public static Products CreateProducts(int productId, string productNameTurkish)
        {
            Products products = new Products();
            products.ProductId = productId;
            products.ProductNameTurkish = productNameTurkish;
            return products;
        }
        /// <summary>
        /// There are no comments for Property ProductId in the schema.
        /// </summary>
        [global::System.Data.Objects.DataClasses
.EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
        [global::System.Runtime.Serialization.DataMemberAttribute()]
        public int ProductId
        {
            get
            {
                return this._ProductId;
            }
            set
            {
                this.OnProductIdChanging(value);
                this.ReportPropertyChanging("ProductId");
                this._ProductId = global::System.Data.Objects
.DataClasses.StructuralObject.SetValidValue(value);
                this.ReportPropertyChanged("ProductId");
                this.OnProductIdChanged();
            }
        }
        private int _ProductId;
        partial void OnProductIdChanging(int value);
        partial void OnProductIdChanged();

Ancak burada dikkat edilmesi gereken bir nokta var. Designer.cs dosyası otomatik olarak oluşturuluyor ve tekrar oluşturulduğunda kodda yaptığınız bu değişiklik silinecektir. Bunu önlemek için de yapmanız gereken bir partial class oluşturup saklamak istediğiniz kolonu attribute ile beraber bu class’a eklemeniz. Böylece model yeniden oluşturulduğunda yaptığınız değişiklikler kaybolmayacaktır:

 [MetadataType(typeof(ProductsMetaData))]
    public partial class Products
    {

    }

    public class ProductsMetaData
    {
        [ScaffoldColumn(false)]
        public int ProductId
        {
            get;
            set;
        }
    }

.Net fw 3.5 ile gelen yeniliklerden bir tanesi:

          string s = "hello";
          string t = new string(s.Reverse().ToArray());

Uygulamalarımızda bir işlemin ne kadar sürdüğünü ölçmek istesek bir çoğumuzun aklına DateTime ve TimeSpan nesnelerini kullanmak gelir. Aşağıdaki gibi:

DateTime dt1 = DateTime.Now;
//burada kod calisiyor
DateTime dt2 = DateTime.Now;
TimeSpan ts = dt2 - dt1;
MessageBox.Show(ts.TotalMilliseconds.ToString());

Ancak yukarıda yazdığımız kod güvenilir bir sonuç döndürmeyecektir. Bunun yerine Stopwatch nesnesini kullanırsak daha net bir sonuç alırız:

Stopwatch sw = new Stopwatch();
sw.Start();
//burada kod calisiyor
sw.Stop();
MessageBox.Show(sw.Elapsed.ToString());

Stopwatch nesnesi bilgisayar saati yerine Windows üzerindeki yüksek performans sayaçlarına dayandığından DateTime nesnesine göre daha kesin ve hızlı sonuç üretecektir.