2017-02-09 2 views
0

Можно ли загружать данные в Treeview в порядке дат из текстового файла? У меня есть некоторые .txt-файлы, которые я загружаю в Treeview. В этих файлах .txt у меня есть Name и Start date, и я хочу загрузить эти имена в порядке даты.Загрузить данные в Treeview в порядке дат C# winforms

Прямо сейчас у меня есть:

string[] animeMainNodeString = animeMainNode.ToArray(); // Parent Nodes Array 

List<string> animeSubNodesList = new List<string>(); 

// Add a child for each Parent in array 
for (int i = 0; i < animeMainNodeString.Length; i++) 
{ 
    string name = animeMainNodeString[i]; // Parent name in array 

    //Search for a .txt files in folders with Parent Nodes names 
    foreach (var subnode in Directory.GetFiles(animeGroupPath + "\\" + name, "*.txt").Select(Path.GetFileNameWithoutExtension).OrderBy(f => f)) 
    { 
     //Read a text file 
     var animeFileRead = File.ReadAllLines(animeGroupPath + "\\" + name + "\\" + subnode + ".txt"); 
     // Titel from this text file 
     string Title = animeFileRead[0].Substring(animeFileRead[0].IndexOf('=') + 1); 

     // Start Date from text file 
     string startDate = animeFileRead[7].Substring(animeFileRead[7].IndexOf('=') + 1); 
     string TitleStart = Title + "," + startDate; 

     // Add to a list where are all names/start dates from this Parent  
     animeSubNodesList.Add(TitleStart); 
    } 

    /* 
    * Here i want to somehow sort the Names by start date 
    * but i have no idea if this is possible. 
    */ 

    foreach (var item in animeSubNodesList) // Add childNode to parent 
    { 
     tvGroups.BeginUpdate(); 

     tvGroups.Nodes[i].Nodes.Add(item); 

     tvGroups.EndUpdate(); 
    } 
} 

дата и название выглядит в текстовом файле: Title=TestStartDate=1986-12-20

Сори за беспорядок кода, я все еще учусь.

ответ

1

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

public class AnimeInfo 
{ 
    public string Title { get; set; } 
    public DateTime StartDate { get; set; } 
    public string TitleStart { get; set; } 
} 


     string[] animeMainNodeString = animeMainNode.ToArray(); // Parent Nodes Array 

     List<AnimeInfo> animeSubNodesList = new List<AnimeInfo>(); 

     // Add a child for each Parent in array 
     for (int i = 0; i < animeMainNodeString.Length; i++) 
     { 

      string name = animeMainNodeString[i]; // Parent name in array 

      //Search for a .txt files in folders with Parent Nodes names 
      foreach (var subnode in Directory.GetFiles(animeGroupPath + "\\" + name, "*.txt").Select(Path.GetFileNameWithoutExtension).OrderBy(f => f)) 
      { 
       AnimeInfo info = new AnimeInfo(); 
       //Read a text file 
       var animeFileRead = File.ReadAllLines(animeGroupPath + "\\" + name + "\\" + subnode + ".txt"); 
       // Titel from this text file 
       info.Title = animeFileRead[0].Substring(animeFileRead[0].IndexOf('=') + 1); 

       // Start Date from text file 
       info.StartDate = animeFileRead[7].Substring(animeFileRead[7].IndexOf('=') + 1); 
       info.TitleStart = info.Title + "," + info.StartDate; 

       // Add to a list where are all names/start dates from this Parent  
       animeSubNodesList.Add(info); 
      } 
      animeSubNodesList = animeSubNodesList.OrderBy(x => x.StarteDate).ToList(); 
      /* 
      * Here i want to somehow sort the Names by start date 
      * but i have no idea if this is possible. 
      */ 

      foreach (var item in animeSubNodesList) // Add childNode to parent 
      { 
       tvGroups.BeginUpdate(); 

       tvGroups.Nodes[i].Nodes.Add(item); 

       tvGroups.EndUpdate(); 
      } 
+0

StarteDate - это строка. Вы пытались заказать по строке? – KernelMode

+0

Спасибо, что нашли время и разместили его здесь :) Все работает! – Bongskie

+0

NP. Как первый январь представлен в StartDate? «1984 - 01 - 01» или «1984 - 1 - 1»? – KernelMode

1

Вы можете конвертировать StartDate в DateTime, а затем упорядочить список перед добавлением к дереву:

var ordered = animeSubNodesList.OrderBy(x => ConvertToTime(x.StartDate)); 

foreach (var item in ordered) // Add childNode to parent 
{ 
     tvGroups.BeginUpdate();  
     tvGroups.Nodes[i].Nodes.Add(item);  
     tvGroups.EndUpdate(); 
} 


private static DateTime ConvertToTime(string time) 
{ 
      return DateTime.Parse(time.Replace(" - ", "/")); 
} 

Во всяком случае, я предпочел бы иметь тип StartDate поля как DateTime в AnimeInfo и бежать преобразование в DateTime (только один раз) при чтении из файла.

Кроме того, вы не указали, как представлены цифры месяца и дня (1986/01/01 или 1986/1/1), поэтому я предложил решение с преобразованием даты, которое работает для любого случая. Используя более позднее представление, порядок строк невелик:

List<string> dates = new List<string>(); 
dates.Add("1986 - 1 - 1"); 
dates.Add("1986 - 2 - 1"); 
dates.Add("1986 - 10 - 1"); 
var ordered = dates.OrderBy(x => x).ToList(); // wrong order 

// ordered = {"1986 - 1 - 1", "1986 - 10 - 1", "1986 - 2 - 1"} 
+0

Спасибо за ваше время, я сделал это, как писал u, и как @Rick james написал с «AnimeInfo» и преобразован в DateTime – Bongskie

Смежные вопросы