2012-03-08 1 views
1

ну, я почти новичок в C#, и я не мог понять, как многоуровневые массивы работают в C#.C# Tree in Array (с массивами как дочерние элементы)

Я сделал TreeView с меню в нем нравится:


  • menu_1
  • --child_1.1
  • --child_1.2
  • ---- child_1 .2.1
  • ---- child_1.2.2
  • ---- child_1.2.3
  • --child_1.3
  • Menu_2
  • --child_2.1
  • --child_2.2
  • ---- child_2.2.1

каждый MenuItem должен иметь 6 proppertys/attributes/values:

Пункт = {ID: int, "NAME: String, POSITION: String, ACTIVE: Bool, ACTION: boo л, PATH: строка}

так:

Menu_1 = { 1, "File", "1", true, false, "" } 
child_1.1 = { 2, "Open", "1.1", true, true, "./open.exe" } 

... и так далее

до сих пор:

я уже вручную установить некоторые строковых массивов (String [ ]) для eath menuItem и заполнил его информацией.

String[] Item_1 = {"1", "File", "1", "1", "0", ""}; 
String[] Item_2 = ... 

... 

теперь я хочу, чтобы положить все эти Струнный-массив внутри ArrayList [] и Сортировать() их с помощью "POSITION" значение каждого пункта (Item_1 [2])

также я хочу, чтобы код динамически создавал этот массив самого элемента, считывая значения из таблицы sql. эти массивы НЕ должны быть просто String-Arrays, как я сделал сейчас, потому что я хочу, чтобы ID оставался int & значением ACTIVE и ACTION, чтобы оставаться bool.

конечный продукт должен выглядеть следующим образом:

MenuItems = ArrayList(
    item_1 = Array(Int, String, String, Bool, Bool, String) // \ 
    item_2 = Array(Int, String, String, Bool, Bool, String) // \ 
    item_3 = Array(Int, String, String, Bool, Bool, String) ///all sortet by the 3rd value, the position) 
    item_4 = Array(Int, String, String, Bool, Bool, String) ///
    ... 
    ) 
) 

спасибо всем, кто может помочь мне.

+0

*** я не хочу у писать все код: D просто хочу получить некоторые советы и, возможно, код snipets ^^ идеи, как вы думаете, что это можно обработать. – Ace

+0

Итак, вы хотите сгладить дерево в один массив? Нет больше иерархии? – Ryan

ответ

0

Предполагая, что вы находитесь на C# 2.0 или новее, я бы использовал общий список вместо ArrayList и контейнер класса, а не только массивы. Предполагая, что вы используете .NET 3.5 или новее, я бы предложил использовать LINQ для сортировки.

Во-первых, сделать контейнер класса для данного типа пунктов меню:

public class MenuItem 
{ 
    public int ID {get;set;} 
    public string Name {get;set;} 
    public string Position {get;set;} 
    public bool Active {get;set;} 
    public bool Action {get;set;} 
    public string Path {get;set;} 
} 

Затем вы можете хранить экземпляры этого класса в общем списке:

var items = new List<MenuItem>(); 
items.Add(new MenuItem{ID="1", Name="File", Position="1", Active=true, Action=false, Path=""}); 

Тогда, чтобы разобраться в этом список по позиции, вы можете использовать LINQ:

var sorted = items.OrderBy(i => i.Position); 
+0

thats awesome, thx много !!! теперь я думаю, я понял, как C# работает с таким «массивом». (если оба из меня хотят, чтобы я проголосовал за ответы на ур, u нужно помочь мне получить некоторую репутацию ^^ Я думаю, что оба ответа полезны, но мне нужно сортировать элементы по атрибутам, а также мне нужны динамические vars вместо определяя Menu_1 или child_1_1, поэтому @ theprise, хорошая работа!) – Ace

0

Вы не можете делать это с помощью массивов в одиночку. Создайте класс, содержащий подпункты в виде массива или в виде списка, если вы хотите быть гибким

public class MenuItem 
{ 
    public MenuItem() 
    { 
     SubItems = new List<MenuItem>(); 
    } 

    public int ID { get; set; } 
    public string Name { get; set; } 
    public string Position { get; set; } 
    public bool Active { get; set; } 
    public bool Action { get; set; } 
    public string Path { get; set; } 
    public List<MenuItem> SubItems { get; private set; } 
} 

Вы можете добавить подразделы, как этот

var child_1_1 = new MenuItem{ 2, "Open", "1.1", true, true, "./open.exe" }; 
Menu_1.SubItems.Add(child_1_1);