Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[C#] Drivetype en driveinfo tonen

Pagina: 1
Acties:
  • 287 views sinds 30-01-2008
  • Reageer

  • Wok
  • Registratie: Augustus 2001
  • Laatst online: 09:45

Wok

Dakloos...

Topicstarter
Ik heb even een schopje in de juiste richting nodig, vandaar dit topic ;)

Vanuit mijn werkgever volg ik een interne cursus C# programmeren (.Net 2.0). Daarbij krijgen we ook per les een huiswerkopdracht. Ik hoor de alarmbellen al rinkelen ( ;) ), maar ik vraag geen kant-en-klare oplossing, Ik zie iets over het hoofd, maar ik weet alleen niet wat dat is..

De huiswerkopdracht is 'simpel': ik moet onderstaande applicatie bouwen:

een basic (Windows) explorer applicatie
(ja, een EXE bestand)

Het tonen van de dirs en files is geen probleem. Ik zit met het probleem om onder meer de informatie van de van de geselecteerde drive te tonen.

Ik laat de comboBox de beschikbare drives tonen door bij het starten van de applicatie de zelf gemaakte functie GetDriveInfo() aan te roepen:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public void GetDriveInfo(string dType)
{
     DriveInfo[] drives = DriveInfo.GetDrives();
     foreach (DriveInfo drive in drives)
     {
         try
         {
             cbxDriveSelection.Items.Add(drive.Name);
             dType = drive.GetType().ToString();
         }
         catch (Exception ex)
         {
             MessageBox.Show(ex.Message);
         }
     }
}


Mijn idee was om een parameter mee te geven aan deze functie om deze te laten vullen met de DriveType, maar dat lukt me dus niet.

Ik heb de functie en de variabele als public gedeclareerd, maar ik kan de (inhoud van) de variabele nergens ophalen :?

Ik ben een complete n00b wat c# betreft (daarom ook de interne opleiding), maar ik ben niet geheel onbekend met proggen.... Ik doe het alleen te weinig en daardoor zie ik nu (waarschijnlijk) iets over het hoofd.

Mijn idee is om bij het starten van de applicatie de beschikbare drives van de PC te kunnen selecteren in de combobox (wat ook lukt) en daarbij wil ik dus wat specifieke informatie van de geselecteerde drive kunnen tonen (en dat lukt me dus niet). Ik moet dus even een duwtje in de goede richting hebben. :)

Who is General Failure and why is he reading my hard drive?


Verwijderd

Ten eerste is drive.GetType() niet de functie om te kijken om wat voor type drive het gaat, ook al zou je in dit geval anders vermoeden. GetType() is een method in de class object (elke class heeft dus die method) om het type (Type class) van de class op te vragen. Het Type object wat je terugkrijgt beschrijft de class m.b.v. reflection, in dit geval DriveInfo. Anyway, het tweede punt is belangrijker.

Ten tweede verander je de variabele die je als parameter meekrijgt. dType is géén pointer (of referentie om in .NET taal te blijven). De parameter die je meegeeft aan een method is voor die method een lokale variabele; veranderingen gelden niet voor buiten de scope. Je method GetDriveInfo moet iets teruggeven. Op dit moment geeft GetDriveInfo een vacuüm (void ;)) terug, maar dat moet dus een string zijn.

Waarom je trouwens in de functie GetDriveInfo het toevoegen van de drives aan een ComboBox had staan is mij niet duidelijk; functies met dergelijk doel moeten van de user interface afblijven. Je doet nu twee dingen door elkaar: met een loop door alle drives lopen, en de drive type teruggeven. Dat lijkt me ook niet de bedoeling.

[ Voor 30% gewijzigd door Verwijderd op 21-01-2008 00:26 ]


  • DrDelete
  • Registratie: Oktober 2000
  • Laatst online: 08:32
wat tips/opmerkingen

1) Maak een functie die heet "GetDrives" en laat deze functie een StringCollection van drives retourneren
2) Laat exception handling hier gewoon weg, ik voorzie hier geen bijzondere gevallen waarop jij met exceptions moet werken. Als je exceptions catch't, catch dan een specifieke ipv een generieke exception (dus: een catch leggen op Exception heeft geen zin)
3) Je doet een GetType call maar doet er verder niks mee, even afgezien van het feit dat deze call het type teruggeeft wat op zich alleen handig is voor reflectie doeleinden (zie reply van negerzoen)
4) Als je een explorer achtige app moet maken dan zul je waarschijnlijk met een treeview werken. Het werkt handig als je een eigen class afleidt van TreeNode. Op deze class kun je dan public properties maken die extra informatie toevoegen aan deze node. Daarna kun je deze node hangen aan een reguliere Treeview. Je kunt ook wat events toevoegen en zodoende de UI beter aan elkaar knopen.
5) Probeer UI en utilities/logica van elkaar te scheiden. Zodoende kun je functionaliteit makkelijker hergebruiken in andere UI's (forms)

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Allereerst wil ik je verzoeken je je functie te hernoemen naar PopulateDriveCombo oid, want je returned absolute helemaal niets (void). En een void kan simpelweg geen get zijn.

Misschien moet je ook meer in de MSDN lezen voordat je een Microsoft class (DriveInfo) besluit te gebruiken. Want je wilt weten wat voor type een drive is. Laat Microsoft daarvoor nou precies de property DriveInfo.DriveType hebben verzonnen welke een waarde van de DriverType enumeratie terug geeft (Fixed, cdom, network, etc).

Tip vanaf mijn kant. Zoals je weet bestaat uit een windows drive altijd uit 1 letter. Als je zorgt dat de eerste letter in de dropdown de betreffende drive voorstelt, kun je daarachter informatie van de drive zetten zoals Label en DriveType. Op het moment dat de gebruiker een selectie in de dropdown heeft gemaakt, kun je met SubString(0,1) simpel de drive letter terug krijgen.

C#:
1
cbxDriveSelection.Items.Add( string.Format( "{0}: [{1}] ({2})", drive.Name, drive.Label, drive.DriveType.ToString() ) );


Wat betreft de variabele die je mee geeft aan de functie. Hiervoor verwijs ik je naam de MSDN secties 'Value- and reference types'. In de C# reference moet je maar eens de de stukken over de keywords 'ref' en 'out' en 'passing arguments' lezen.

Om je toch op weg te helpen:
C#:
1
2
3
4
public static DriveInfo GetDriveInfo(string driveLetter)
{
    return new DriveInfo(driveLetter);  //  <-- wants A, C.
}


Uiteraard moet je nog wel wat validatie op driveLetter toevoegen (bijvoorbeeld de controle dat het aantal tekens precies 1 en. Misschien zelfs een Char.IsLetter(). Daarbij zal het waarschijnlijk ook verstandig zijn om new DriveInfo in een try..catch block te zetten, mocht de drive niet bestaan.

If it isn't broken, fix it until it is..


  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 11:14
Niemand_Anders schreef op maandag 21 januari 2008 @ 09:21:
Uiteraard moet je nog wel wat validatie op driveLetter toevoegen (bijvoorbeeld de controle dat het aantal tekens precies 1 en. Misschien zelfs een Char.IsLetter(). Daarbij zal het waarschijnlijk ook verstandig zijn om new DriveInfo in een try..catch block te zetten, mocht de drive niet bestaan.
Je kunt beter gewoon meteen een Char gebruiken, toch?

  • Wok
  • Registratie: Augustus 2001
  • Laatst online: 09:45

Wok

Dakloos...

Topicstarter
Heren (dames?), dank! :)

Ik zat gisteren blijkbaar te slapen :P Ik had inderdaad op de manier van Niemand_Anders moeten werken :)

Who is General Failure and why is he reading my hard drive?

Pagina: 1