2011-06-03 5 views
5

Kullanıcıya gösterilecek nesnelerin bir listesi var. Temel olarak, kullanıcı tarafından bir izin kümesidir. Kullanıcılar ile sütun ve işlem olarak satırlar olarak bir tablo görüntülemek istiyorum. Daha sonra kullanıcı ve eylem arasındaki kesişme izni görüntülenir.Veri yapısı, sütun ve satır dizesi dizinlerine göre dizine eklenecek veriyi içerecek

Bu verileri C# veri yapısında temsil etmenin bir yolunu arıyorum. Her "hücre" için bir varsayılan değer sağlamanın yanı sıra kullanıcı (dizgi) ve eylem (dizgi) kullanarak erişime izin verir. İdeal olarak, otomatik kolon oluşturma ile bir Grid Kontrolüne bağlı olacaktır.

Bir dizi harika olurdu ancak yalnızca tamsayılar dizin olarak izin veriyor. Yeni bir satır/sütun eklendiğinde dizinin yeniden oluşturulması ve kopyalanması gerekir.

Dictionary<String, Dictionary<String, Permission>> nesnesini oluşturmayı düşündüm, ancak çok fazla hata denetimi gerektiriyor ve datagrid denetimleriyle iyi çalışmıyor.

Bu tür bir veri yapısı için mevcut (açık kaynak?) Bir proje var mı? Temel olarak, "iki tuşlu" bir yapının geliştirilmiş bir versiyonudur. Otomatik sütun nesil ızgara kontrolleri dost olan bir veri yapısını istiyorsanız

sizi

+0

belki söylemek [buradan] kontrol etmek gidiyordu (http://stackoverflow.com/questions/5382299/retrieval-of-custom-collection/5382893 # 5382893) bir fikir için, ama ben her anahtar için aynı tür kullandığınız için amaçlarınıza uyacağından emin değilim. Bunu başka bir mekanizma yoluyla açıklığa kavuşturmak zorunda kalacaksınız. –

+0

@Anthony Pegram Teşekkür ederim ama benim durumumda, bir değer almak için her iki anahtar da gereklidir. –

+1

İhtiyacı anlıyorum, sadece bir türü paylaşan tuşların biraz farklı olmasını sağlıyor. Örneğin, bir indeksleyici kullanılmayacağından, örneğin GetByUser ve GetByAction yöntemleriyle özel bir koleksiyon yazabilirsiniz. –

cevap

3

ederiz, sonra da seçim veri yapısı bir DataTable olduğunu. Bir DataTable, tam olarak istediğiniz şey olan satır ve sütunlar tarafından düzenlenmiş dinamik iki boyutlu bir veri dizisi gibidir. Gerçekte sütunlar dizeleri tarafından dizine eklenir, bu da istediğinizdir. Tek yapmanız gereken, DataTable dizgisini dizelerle adreslemek için bir yol buluyorsa, hepimiz ayarlanacağız!

İşte bir DataTable böylece ızgara kontrolleri ile kullanabilirsiniz olan PermissionMap bir uygulamasıdır, ama aynı zamanda iki dizeleri ile indeksleme desteklemek için bazı altyapıya sahiptir . Kesin yaklaşım değişebilir, ancak temel fikir eklemek sonra DataTable başlayıp şudur:

  • kullanıcı eylemleri besleyen Bir yapıcı
  • varsayılan izinleri yeni kullanıcı eklemek ve ayarlamak için bir AddUser yöntem
  • 012: kullanıcı ve eylem Burada

tarafından

  • bir iki dizin almak için parametre ve izinleri ayarlama örnek bir uygulama var
    public enum Permission 
    { 
        Default = 0, 
        Disallow = 0, 
        Allow = 1, 
    } 
    
    public class PermissionMap : DataTable 
    { 
        private Dictionary<string, int> actionMap = new Dictionary<string, int>(); 
    
        public PermissionMap(IEnumerable<string> actions) 
        { 
         Columns.Add(new DataColumn("Action")); 
         int i = 0; 
         foreach (var action in actions) 
         { 
          actionMap.Add(action, i++); 
          var row = NewRow(); 
          row["Action"] = action; 
          Rows.Add(row); 
         } 
        } 
    
        public void AddUser(string user) 
        { 
         Columns.Add(new DataColumn(user)); 
         foreach (DataRow row in Rows) 
          row[user] = Permission.Default; 
        } 
    
        public Permission this[string user, string action] 
        { 
         get { return (Permission)Rows[actionMap[action]][user]; } 
         set { Rows[actionMap[action]][user] = value; } 
        } 
    } 
    

    Ve burada küçük bir gösteri programı: Bu çıktı üretir

    class Program 
    { 
        static void Main(string[] args) 
        { 
         var permissionMap = new PermissionMap(new[] { "Read", "Write" }); 
         permissionMap.AddUser("Bill"); 
         permissionMap.AddUser("Jane"); 
         permissionMap["Bill", "Read"] = Permission.Allow; 
         permissionMap["Jane", "Write"] = Permission.Allow; 
         foreach (DataColumn column in permissionMap.Columns) 
         { 
          Console.Write(column.ColumnName); 
          Console.Write(","); 
         } 
         Console.WriteLine(); 
         foreach (DataRow row in permissionMap.Rows) 
         { 
          foreach (DataColumn column in permissionMap.Columns) 
          { 
           Console.Write(row[column]); 
           Console.Write(","); 
          } 
          Console.WriteLine(); 
         } 
         Console.ReadKey(); 
        } 
    } 
    

    :

    Action,Bill,Jane, 
    Read,Allow,Disallow, 
    Write,Disallow,Allow, 
    
  • +0

    Siz bir selam hak ediyorsunuz. Çok teşekkür ederim ;) –