24. april 2007 - 22:00Der er
42 kommentarer og 2 løsninger
Tilgå en metode fra en anden klasse
Jeg har min klasse "Form1" som indeholder alle mine labels, textboxe osv. I denne klasse har jeg også en "public void" metode der hedder "updateForm" som opdatere nogle af mine textboxe på formen udfra et array.
Mit problem kommer så når jeg en anden klasse der hedder "runClass" som skal kalde denne "updateForm" fordi klassen nu har ændret indeholde i det array jeg arbejder med og så skal textboxene opdateres (hvilket min updateForm gør for mig)
Hvordan tilgår jeg "updateForm" fra min "runClass"
nu er jeg ikke helt med på hvad du mener med det, men jeg har min runClass i en seperat fil, som arbejder med det info som der er i et static array og det er alt den gør, så skal den bare kalde min metode!
i din runClass har du en konstruktør public runClass() { } Der kan du lave yderligere en version: public Form1 f1; public runClass(Form1 fref1) { f1=fref1; }
Nu kan du kalde updateForm i din metode som behandler data med: f1.updateForm();
Ville i det hele taget nok lave en hel masse om...
nede i run class laver du MP3File objecter og trækker info ud af dem til in samlet streng, en streng som du sennere splitter op for at få de enkeltståenden informationer ud hver for sig... spildt arbejde imo... fyr objecterne op istedet og spar arbejdet...
runclass til en singleton i dit tilfælde... hvis det overhovedet giver mening... (kunne man tænke sig at lave flere søgninger på samme tid?)...
her er hvad jeg nok ville lave RunClass om til..
public class MP3File { //... //Din MP3File Klasse
public override string ToString() { return "Returner en passende formatering på en MP3"; } }
public class RunClass { private static RunClass _instance = new RunClass(); public static RunClass Instance { get { return RunClass._instance; } } private RunClass() { }
public event EventHandler<EventArgs> RunClassUpdated;
private List<MP3File> _list = new List<MP3File>();
//Exponering af Liste, gøres med alle andre fields der skal kunne tilgåes ude fra også. //Jeg har kun vist hvordan med List her... public List<MP3File> List { get { return _list; } }
public void ThreadFind() { this._songId = 0; this.Find( new DirectoryInfo( _dir ) ); }
public void Find( DirectoryInfo dir ) { foreach ( FileInfo f in dir.GetFiles( "*.mp3" ) ) { MP3File mp3 = ID3reader.ReadID3Tags( f.Name ); this._list.Add( mp3 ); sangId++; } foreach ( DirectoryInfo d in dir.GetDirectories() ) { this.Find( d ); } SearchFinish = true;
Den ligger i System, som jeg formåder du har... ellers hjælper det typisk lige at holde musen hen over den... så kan det være den kan finde den for dig...
Det kan godt være det er en eller anden fantastisk smart måde den er implementeret på i C#... ændre ikke på:
a. Jeg er imod public fields... b. Den er OVERHOVEDET ikke lazy bound... c. Der er stadig 1000 måder at implementere en singleton på... som alle også er korekte...
Det er ens?... jeg skrev jeg gik ud fra at med: public static readonly <T> Instance = new <T>();
Mente du: public static readonly SingleTon Instance = new SingleTon();
Men det er IKKE en singleton nogen af dem... For der mangler en private constructor. _______________________________________________________________________________ Så http://msdn2.microsoft.com/en-us/library/ms998558.aspx er forkert?...
Nej... det er begge meget korrekte måder at gøre det på... som jeg sagde tidligere er der 1000 måder at gøre det på... og din er en af dem, ingen tvivl... men det du viser er ikke MÅDEN at gøre det på i C#... det er ÉN af måderne at gøre det på i C#...
Den løsning jeg brugte der gav fejlen: "Cross-thread operation not valid: Control 'listView1' accessed from a thread other than the thread it was created on."
void RunClass_RunClassUpdated( object sender, EventArgs e )
Bliver kaldt af dit event, dvs. nede fra din RunClass... der skal du lige finde ud af hvornår og hvor tit du vil opdatere?...
Hvis det er når søgningen er udført så er det jeg indledende gav dig fint... det er så her du kalder din void RunClass_RunClassUpdated( object sender, EventArgs e ):
public class SingleTon { public static event EventHandler<EventArgs> Update; public static int current; public static void DoStuff() { for ( int i = 0; i < 100; i++ ) { current = i; if(SingleTon.Update != null) SingleTon.Update( null, EventArgs.Empty ); } } }
fx...
Grunden til jeg lavede dit kode mere om end det... var at jeg syntes det ville give bedre mening hvis du havde en singleting frem for alle de statiske lister og fields...
Lige pt virker det med events lidt uoverskueligt, så jeg tror jeg vil begynde i det små, med at kunne kalde en anden klasse, som så ændre teksten i labels osv. jeg har læse lidt på msdn om det, men findes der andre gode steder man kan læse når man vil begynde med events?
Events er til at starte med faktisk meget simpelt efter min mening... Som du kan se i det jeg postede oven for er der vist ikke mange linier der omhandler selve eventet ;)
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.