Чтение данных из элемента ArrayList

Язык C#: программирование на C#, портирование кода C# на VB и VB на C#.

Модератор: Ramzes

Thomas
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 246
Зарегистрирован: 12.11.2005 (Сб) 0:17
Откуда: "Сказочное королевство"

Чтение данных из элемента ArrayList

Сообщение Thomas » 23.04.2006 (Вс) 23:54

Приветствую всех.
Помогите бедному студенту. Туплю :oops:
Проблема возможно проста, но я пока ни как решить не могу.

Создал ArrayList содержащий данные различных типов на клиентов(данные типа int, string, datetime - ну там номер, ФИО, адрес)
Заполняю ArrayList данными, могу вывести данные по столбцам в листвью с помощью foreach(). Могу найти по номеру клиента.
Но не могу вывести данные на найденного клиента в label.

В msdn приводят в качестве примера простейший синтаксис

ArrayList myArL = new ArrayList();
myArL.Add(data); // запись
data=myArL[index]; //чтение
и все.
А что делать если там много данных записано. Не просто одного типа, а разных. Как их от туда выудить?

Заранее спасибо.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 24.04.2006 (Пн) 9:49

Расскажи подробнее, в чём проблема-то?
Ты двумерную структуру засунул в одномерный ArrayList, что ли?
Изображение

Thomas
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 246
Зарегистрирован: 12.11.2005 (Сб) 0:17
Откуда: "Сказочное королевство"

Сообщение Thomas » 24.04.2006 (Пн) 13:30

Привествую всех.
Рассказываю подробнее.
Учусь в вечерней школе. Пишем учебную программу. Имитация работы оптового магазина или склада. Имеются: список клиентов с различными данными на них и список товаров с их описанием. Данные и на клиентов и на товары как Вы понимаете генерятся от "балды". Это реализованно в двух отдельных классах - Persoon и Artikel.

Код: Выделить всё
public class Persoon
   {
   # region attributen
      int persNr; // volgnr
      string vnm; // voornaam
      string nm;  // familienaam
      string straatNr; // adres
      string postcode;
      string gemeente;
      DateTime gebDat; // gebdatum
      #endregion
   # region constructors
      public Persoon(int getal)
      {
         TimeSpan t;
         DateTime startdat= new DateTime(1980,1,1);
         persNr=getal;
         vnm=Globals.eigennaam(Globals.nrToString(getal+1));
         nm=Globals.nrToString(getal);
         straatNr=Globals.inverseer(nm)+" "+(getal%100);
         postcode=Convert.ToString((getal%100)*100+1000);
         gemeente=Globals.nrToString((getal%100)*100+1000);
         t=new TimeSpan(getal,0,0,0);
         if(getal%2==0)
            gebDat=startdat.Add(t);
         else
            gebDat=startdat.Subtract(t);
      }
      #endregion
   #region methods

      #endregion
   # region property

      public string PersoonNr
      {
         get{return persNr.ToString();}
      }
      public string VoorNaam
      {
         get{return vnm;}
      }
      public string FamilieNaam
      {
         get{return nm;}
      }
      public string Adres
      {
         get{return straatNr;}   
      }
      public string Postcode
      {
         get{return postcode;}
      }
      public string Woonplaats
      {
         get{return gemeente;}
      }
      public string Datum
      {
         get{return gebDat.ToShortDateString();}
      }

   #endregion
   #region vergelijking
      public class cmpNr:IComparer
      {
         int IComparer.Compare(object o1, object o2)
         {
            if(o2.GetType()==typeof(Persoon))
               return ((Persoon)o1).persNr - ((Persoon)o2).persNr;
            else
               return ((Persoon)o1).persNr - (int)o2;
         }
      }
      public class cmpVoorNaam:IComparer
      {
         int IComparer.Compare(object o1, object o2)
         {
            return string.Compare(((Persoon)o1).vnm, ((Persoon)o2).vnm);
         }
      }
      public class cmpFamilieNaam:IComparer
      {
         int IComparer.Compare(object o1, object o2)
         {
            return string.Compare(((Persoon)o1).nm, ((Persoon)o2).nm);
         }
      }
      public class cmpZip:IComparer
      {
         int IComparer.Compare(object o1, object o2)
         {
            return string.Compare(((Persoon)o1).postcode, ((Persoon)o2).postcode);
         }
      }

      #endregion

   }

Код: Выделить всё
public class Artikel
   {
   #region attributen

      long artNr;
      string artNaam;
      string barcode;
      double prijs;
      int voorraad;
      int minstock;

   #endregion

   #region konstructors

      public Artikel(int volgnr)
      {
         artNr=volgnr+1000;
         artNaam=Globals.nrToString(volgnr);
         barcode=maakEan(artNr); // генерим баркод на основе номера товара.
         prijs=volgnr+(volgnr/5.0);
         voorraad=volgnr/10;
         Random gen=new Random(115);
         minstock=gen.Next(10);
      }

   #endregion

   #region property

      public string ArtNr
      {
         get{return artNr.ToString();}
      }
      public string ArtNaam
      {
         get{return artNaam;}
      }
      public string Barcode
      {
         get{return barcode;}
      }
      public string Prijs
      {
         get{return prijs.ToString();}
      }
      public string Voorraad
      {
         get{return voorraad.ToString();}
      }
      public string Minstock
      {
         get{return minstock.ToString();}
      }

   #endregion

   }

Далее на форме есть два листвью. Один отображает список клиентов, другой список товаров. Заполняются они в принципе одинаково. Тут проблем нет. Используем ArrayList потому что кол-во клиентов и товаров может меняться. А значит нужна возможность добавлять и удалять элементы.
Так заполняем ArrayList данными. Здесь получается, если я правильно понимаю, заполнение массива экземплярами классов Persoon и Artikel соответственно. Потому как данные на клиента и на товар создаются в конструкторе соответствующего класса.
Код: Выделить всё
private ArrayList Klanten = new ArrayList();
private ArrayList Artikelen = new ArrayList();

private void btnMaakKlant_Click(object sender, System.EventArgs e)
      {
         int n=10;
         DateTime dat= DateTime.Now;
         Random gen=new Random(dat.Millisecond);
         int loper;
         for(loper=0;loper<n;loper++)
         {
            Persoon p=new Persoon(gen.Next(997)); // создаем экземпляр класса
            if(Klanten.IndexOf(p)<0)
            {
               Klanten.Add(p); // записываем его в ArrayList
            }
            toonKlanten(); // показываем данные в листвью.
         }
      }
      private void toonKlanten()
      {
         int index=0;
         lstvKlant.Items.Clear();
         foreach(Persoon el1 in Klanten) // перебираем все элементы el1 типа  Persoon в ArrayList Klanten
         {
            lstvKlant.Items.Add((index+1).ToString());
            lstvKlant.Items[index].SubItems.Add(el1.PersoonNr.ToString());
            lstvKlant.Items[index].SubItems.Add(el1.VoorNaam);
            lstvKlant.Items[index].SubItems.Add(el1.FamilieNaam);
            lstvKlant.Items[index].SubItems.Add(el1.Adres +", " + el1.Postcode +", " + el1.Woonplaats);
            lstvKlant.Items[index++].SubItems.Add(el1.Datum);
         }
      }

Список товаров делается точно так же.
Далее имея клиентов и товары нужно их продавать. Ищем клиента или по номеру или по имени. Для этого есть два текстбокса. Вводим номер
клиента и при помощи Бинарного поиска находим нужный элемент в массиве. Далее нужно отобразить эти данные, в нашем задании, пока на label. И вот тут у меня засада.
Поиск реализовал так ( там в каждом классе есть код IComparer так как перед поиском по клику на столбец в листвью выполняется сортировка)
Код: Выделить всё
private void txtZoekNr_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
      {
         if(e.KeyChar==13)
         {
            int vindpos=-1;
            Object zoekwarde=int.Parse(txtZoekNr.Text);
            vindpos=Klanten.BinarySearch(zoekwarde, new Persoon.cmpNr());
            Persoon data=Klanten[vindpos];
            lblKlantData.Text=data.PersoonNr+", "+data.VoorNaam+", "+data.FamilieNaam+", "+data.Adres+", "+data.Postcode+", "+data.Woonplaats+", "+data.Datum;
         }
      
      }


И вот в последних двух строчках Студия (2003) выдает ошибку. Говорит так нельзя. Не может конвертировать тип обьекта в тип Persoon.
Далее думаю возникнет проблема с отображением найденных по части имени клиентов в листвью. Почему в листвью? Потому как возможны дубликаты( часть имени одинаковая). Потом из этих нескольких нужно будет выбрать нужного и листвью спрятать, а данные на этого клиента отобразить опять же в label.

Вот такая у меня первая проблема в этой учебной программе
Изображение Изображение
Последний раз редактировалось Thomas 24.04.2006 (Пн) 15:11, всего редактировалось 1 раз.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 24.04.2006 (Пн) 13:50

Thomas писал(а):
Код: Выделить всё
            Persoon data=Klanten[vindpos];
            lblKlantData.Text=data.PersoonNr+", "+data.VoorNaam+", "+data.FamilieNaam+", "+data.Adres+", "+data.Postcode+", "+data.Woonplaats+", "+data.Datum;
         }
      
      }


И вот в последних двух строчках Студия (2003) выдает ошибку. Говорит так нельзя. Не может конвертировать тип обьекта в тип Persoon.

ну, если проблема только в этом, то сделай каст явным:
Код: Выделить всё
Persoon data=(Persoon)(Klanten[vindpos]);
Изображение

Thomas
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 246
Зарегистрирован: 12.11.2005 (Сб) 0:17
Откуда: "Сказочное королевство"

Сообщение Thomas » 24.04.2006 (Пн) 14:02

tyomitch

Благодарю и снимаю шляпу в благодарном поклоне.
Чувствовал что не очень сложно, но как не знал.

А Ведь в принципе в другом упражнении когда писал функцию для
IComparer.Compare делал нечто подобное.

Код: Выделить всё
public class VglVolgnr : IComparer
   {
      int IComparer.Compare(Object el1, Object el2)
      {
         if(el2.GetType()==typeof(gegevens)) // gegevens это структура с различными типами данных.
            return (int)(((gegevens)el1).volgnr - ((gegevens)el2).volgnr);
         else
            return (int)(((gegevens)el1).volgnr - (long)el2);
      }
   }

Приводил возвращаемое значение к явному типу Intiger.

Еще раз спасибо.

Теперь займусь поиском клиента по имени или части имени.


Вернуться в C#

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

    TopList