Привествую всех.
Рассказываю подробнее.
Учусь в вечерней школе. Пишем учебную программу. Имитация работы оптового магазина или склада. Имеются: список клиентов с различными данными на них и список товаров с их описанием. Данные и на клиентов и на товары как Вы понимаете генерятся от "балды". Это реализованно в двух отдельных классах - 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.
Вот такая у меня первая проблема в этой учебной программе