2016-03-12 2 views
0

Я читаю файл, который ищет, как это с большим количеством строкПолучить продукты свойства указанной даты

PrId Name Quantity Price Date 
    3  Milk 2  100 23-08-15 

У меня есть кнопка - btnDat_Click. Когда я нажимаю, он получает все даты в списке с именем listDate. Я создаю кнопку с именем btnDataToTb_Click, мне нужно выбрать дату, и когда я нажму кнопку, она отобразит свойства (Id, Name, Quantity) всех продуктов этой даты.

PrId Name Quantity Price 
    3  Milk 2   100 

Вот весь код

char[] cc = new char[500]; int i, nr; 
string[] lines = new string[250]; 

public void btnRead_Click(object sender, EventArgs e) 
{ 
     string FileName = textBox1.Text; 
     FileStream r_stream = new FileStream(FileName, FileMode.Open, FileAccess.ReadWrite); 
     StreamReader reads_string_from_r_stream = new StreamReader(r_stream); 

     i = 0; 
     listBox1.Items.Clear(); 
     listBox2.Items.Clear(); 

     for (; ; i++) 
     { 
      textBox1.Text = reads_string_from_r_stream.ReadLine(); 
      lines[i] = textBox1.Text; 
      listBox1.Items.Add(lines[i]); 
      listBox2.Items.Add(lines[i]); 

      if (reads_string_from_r_stream.EndOfStream.Equals(true)) goto nn;  
     } 
nn: 
     textBox2.Text = reads_string_from_r_stream.EndOfStream.ToString(); 
     r_stream.Close(); 

     nr = listBox1.Items.Count; 
     textBox6.Text = nr.ToString(); 
} 

private void SelectPath_Click(object sender, EventArgs e) 
{ 
    OpenFileDialog openFile1 = new OpenFileDialog(); 
    openFile1.Filter = "Text Files|*.txt"; 
    if (openFile1.ShowDialog() == System.Windows.Forms.DialogResult.OK) 
    textBox1.Text = openFile1.FileName; 
} 

public void button1_Click(object sender, EventArgs e) 
{ 
    int n = Convert.ToInt16(textBox6.Text); 
    ListB.Items.Clear(); 
    for (i = 0; i < n; i++) 
    { 
     ListB.Items.Add(lines[i]); 
    } 
} 

private void btnDat_Click(object sender, EventArgs e) 
{ 
    int n = Convert.ToInt16(textBox6.Text); 
    for (i = 0; i < n; i++) 
    { 
     if(! listDate.Items.Contains(lines[i].Split('\t')[lines[i].Split('\t').Length - 1])) 
     { 
      listDate.Items.Add(lines[i].Split('\t')[lines[i].Split('\t').Length - 1]); 
     } 
    } 
    listData.Items.RemoveAt(0); 
} 

private void btnDataToTb_Click(object sender, EventArgs e) 
{ 
    if (listData.SelectedItems.Count > 0) 
    { 
     string data = listData.SelectedItem.ToString(); 

     string[] date = data.Split('-'); 
     int day = Convert.ToInt32(date[0]); 
     int month = Convert.ToInt32(date[1]); 
     int year = Convert.ToInt32(date[2]); 

     DateTime a = new DateTime(year, month, day); 


     for (i = 0; i < listBox2.Items.Count; i++) 
     { 
      DateTime data2 = DateTime.Parse(lines[i].Split('\t')[lines[i].Split('\t').Length - 1]); 
      int result = DateTime.Compare(a, data2); 
      if(result == 0) 
      listBox3.Items.Add(string.Format("{0}\t{1}\t{2}\t{3}", lines[i].Split('\t')[0], lines[i].Split('\t')[1], lines[i].Split('\t')[2], lines[i].Split('\t')[3])); 
     } 




    } 
    else 
    { 
     MessageBox.Show("Select a date"); 
    } 




} 
+0

Вы действительно должны начать изучать, как использовать классы, общую коллекцию объектов и некоторые более «расширенные» функции языка, такие как while и foreach. Забудьте сказать, что GOTO ... как сказать это ... зло? – Steve

ответ

1

Я бы сказал, что вы приближается эту проблему неправильно. Вместо того, чтобы читать данные, сохраняя их в списке, а затем читать и снова разборе их, когда вам нужно, что очень сложно, вам лучше сделать это:

  • Создать новый класс (например, Item), что имеет свойства для идентификатора продукта, имени, количества, цены и даты.
  • При чтении данных разберите строки сразу и создайте новый экземпляр указанного класса для каждой строки. Храните их в List<Item>.
    • При работе с FileStream, StreamReader и т.д. (все, что реализует IDisposable/имеет метод Dispose()), вы должны использовать их в using блоке (как using (StreamReader sr = …) { /* work with sr here */ }); это автоматически освободит объект после использования.
  • Для того, чтобы данные были видимыми для графического интерфейса, вы можете использовать привязку данных или заполнить список вручную и получить выбранный элемент с помощью SelectedIndex.
  • Используйте Linq для запроса данных. Чтобы выбрать все товары в определенную дату, вы можете использовать var onThisDate = itemList.Where(item => item.Date == selectedDate). Linq имеет гораздо больше функций для выбора, фильтрации и проецирования данных.
Смежные вопросы