9 svar
59 visningar
Fourier är nöjd med hjälpen
Fourier 42
Postad: 28 nov 2020

Mellan klass och Form

Hej

Jag har skapat en klass:

public class ProductList<T> : BindingList<T>
{

     public BindingList<Product> productList { get; set; }

     public ProductList()
     {
          productList = new BindingList<Product>();
     }

     public Product ProductFinder(string id) 
     {
          foreach (var product in productList)
          {
               if (product.Id == id)
                    return product;
          }
          return null;
     }
}

(Product är en annan klass för att skapa objekt/produkter.) I min Form har jag:

public ProductList<Product> productList = new ProductList<Product>();

där productList innehåller en massa produkter. Vidare anropar jag klassens metod ProductFinder i Formen:

Product product = productList.ProductFinder(id);

Jag får inget fel i kompileringen men när klassen ProductList kör metoden ProductFinder så är productList tom när jag stannar programmet och tittar på listan i metoden ProductFinder även fast den inte är det Formen innan jag anropar metoden ProductFinder.

Det fungerar om jag skickar med productList som parameter i metoden ProductFinder men som jag har förstått det ska det inte behövas då jag har get set i propertyn för productList i klassen. Någon som vet varför productList är tom i metoden ProductFinder om jag inte skickar med den som parameter?

Laguna 13518
Postad: 28 nov 2020

Du har en productList, och du har lagt saker i den, men vad gör du sedan med den? Sätter du productList.productList till något?

Fourier 42
Postad: 28 nov 2020

productList är en BindingList som jag bundit till två stycken DataGridViewer(DGV). Använder productList för alla ändringar som ska göras i DGVerna dvs om användaren ska lägga till eller ta bort en produkt i programmet så ändras productList som i sin tur ändrar i DGVerna.

Vad innebär productList.productList? Då jag har satt att klassen ProductList ärver från BindingList så kan jag använda BindingList properties exempelvis Add() på productList. Om jag har skapat en ny produkt som ska läggas in i productList blir koden:

productList.Add(product);

Laguna 13518
Postad: 28 nov 2020

productList inuti klassen och productList utanför torde vara olika saker. Jag provar min förståelse (för jag kan inte C#) genom att föreslå att du ändrar namn på productList inne i klassen till myProductList (och i metoden ProductFinder och ser om något blir annorlunda. Men inte utanför.

Tigster 252
Postad: 28 nov 2020 Redigerad: 28 nov 2020

Det är väl en constructor? För övrigt borde du väl ha en variabel productList som attribut till klassen? Annars skapar du en lista som dör efter scope. Du spar den aldrig någonstans? Kanske inte är hela klassdefinitionen iofs.

 

Ah, du la det som public. Aldrig hållt på med C# utöver Unity typ. :/

Jag skulle lagt en privat variabel som du definierar mha constructorn. 
private BindingList productList;

public ProductList() { productList = new BindingList<Product>(); }

Fourier 42
Postad: 28 nov 2020

Tack för svar Laguna och Tigster. Testade båda era förslag men inget fungerade. Testade lite annat och upptäckte det som du nämner Laguna om det med inne och utanför ur klassen.

Om jag gör en metod public void AddIn(Product product) inne i klassen ProductList som använder BindingListmetoden Add() på den inre myProductList (productList inne i klassen, ändrade namn som Laguna tipsade om) så verkar alla product läggas i myProductList inne i klassen:

public void AddIn(Product product)
{
myProductList.Add(product);
}

När jag gör så verkar den yttre productList vara tom och bara pekar eller nått sånt på klassens inre myProductList som innehåller alla products. 

Om jag gör ytterligare en metod i klassen ProductList som binder myProdcutList till DGV:erna innan jag fyller myProdcutList med products så fylls DGV:erna när jag fyller myProductList inne i klassen. Metoden måste ta emot DVGerna som argument:

public void BindDVG(DataGridView DVG1, DataGridView DVG2)
{
DVG1.DataSource = myProductList;
DVG2.DataSource = myProductList;
}

och klassen ProductList måste använda using System.Windows.Forms; för att kunna hantera DGVerna då de hör till Form klassen.

När jag gjort detta behöver jag inte skicka productList som argument i metoden ProductFinder() då allt finns i klassens myProductList förutsatt att jag använder myProductList i metoden:

 public Product ProductFinder(string id) 
     {
          foreach (var product in myProductList)
          {
               if (product.Id == id)
                    return product;
          }
          return null;
     }

 

Tack för all hjälp!

Aerius 510
Postad: 28 nov 2020

Kanske det skapas ett till instans av produktList i Form som används istället för den produktList som är tänkt att användas.

Fourier 42
Postad: 28 nov 2020

Aerius utveckla gärna. Nyfiken.

Aerius 510
Postad: 28 nov 2020

Nu hänger jag med. Klassen ProductList ärver BindingList. Om du använder metoder från basklassen kommer dessa påverka instansvariabler från basklassen. Det är förvirrande att kalla både klassen för ProductList samt instansvariabeln för productList tycker jag.

Metoden ProductFinder kan loopa igenom sig själv. foreach (var product in this).

Det skulle förmodligen vara enklare om du använder composition istället för inheritance, klassen ProductList kan ha en instansvariabel BindingList. Skriv klassen ProductList som du gjorde i inlägget före mitt där du fick det att fungera.

Fourier 42
Postad: 29 nov 2020

Tack för svar Aerius. Jag har tyvärr inte läst objektorienterad programmering men jag har kollat lite i kurslitteraturen för C# och tror jag förstår vad du menar.

Svara Avbryt
Close