Problem bei "OOP"

10/07/2015 17:50 Cotigo#1
Hiho,

ich habe ein Problem mit der ich sag jetzt mal Versuch an "OO"-Programmierung.
Ich möchte das in der Main-Form beim laden sogesehen die Laufwerke initialisiert werden und in eine Klasse gepackt werden, jedoch tut er dies nicht so wie ich es möchte. Er gibt keine Klasse aus die ich erstelle, noch sonst irgendwie. Wenn ich es nur via DriveInfo versuche klappt das ohne Probleme.
Vielleicht kann mir ja jemand von euch helfen.
Hier ist der Code den ich dafür verwende:

Main-Form
Code:
using System;
using System.Drawing;
using System.Windows.Forms;

namespace FileInitializer
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Drive.getDrives();
            int y = 12;
            foreach(Drive drive in Drive._driveLst)
            {
                Button btn = new Button();
                btn.Text = drive.Label + " (" + drive.Name + ")";
                btn.AutoSize = true;
                btn.Location = new Point(5, y);
                y = y + btn.Height;
                tabPage3.Controls.Add(btn);
            }
        }
    }
}
Drive-Klasse
Code:
using System.Collections.Generic;
using System.IO;
using System.Management;

namespace FileInitializer
{
    public class Drive
    {
        public string Name;
        public string Label;
        public double TotalSize;
        public string TotalSizeStr;
        public double FreeSize;
        public string FreeSizeStr;
        public string SN;

        private static List<Drive> driveLst;
        public static List<Drive> _driveLst
        {
            get { return driveLst; }
            set { driveLst = value; }
        }

        public static void getDrives()
        {
            driveLst = new List<Drive>();
            DriveInfo[] drives = DriveInfo.GetDrives();
            foreach (DriveInfo drive in drives)
            {
                if (drive.IsReady)
                {
                    createDrive(drive.Name,
                        drive.VolumeLabel,
                        Check.systemSize(drive.TotalSize),
                        Check.sizeName(drive.TotalSize),
                        Check.systemSize((drive.TotalSize - drive.TotalFreeSpace)),
                        Check.sizeName((drive.TotalSize - drive.TotalFreeSpace)),
                        getHDDSN(drive.Name));
                }
            }
        }

        private static void createDrive(string name, string label, double tsize, string tsizestr, double fsize, string fsizestr, string sn)
        {
            Drive d = new Drive();
            d.Name = name;
            d.Label = label;
            d.TotalSize = tsize;
            d.TotalSizeStr = tsizestr;
            d.FreeSize = fsize;
            d.FreeSizeStr = fsizestr;
            d.SN = sn;
            driveLst.Add(d);
        }

        public static string getHDDSN(string drive)
        {
            if (drive == "" || drive == null)
                drive = "C";

            ManagementObject disk = new ManagementObject("Win32_LogicalDisk.DeviceID=\"" + drive + ":\"");
            disk.Get();
            return disk["VolumeSerialNumber"].ToString();
        }
    }
}
10/07/2015 19:19 Gareas#2
Quote:
Originally Posted by Cotigo View Post
Hiho,

ich habe ein Problem mit der ich sag jetzt mal Versuch an "OO"-Programmierung.
Ich möchte das in der Main-Form beim laden sogesehen die Laufwerke initialisiert werden und in eine Klasse gepackt werden, jedoch tut er dies nicht so wie ich es möchte. Er gibt keine Klasse aus die ich erstelle, noch sonst irgendwie. Wenn ich es nur via DriveInfo versuche klappt das ohne Probleme.
Vielleicht kann mir ja jemand von euch helfen.
Hier ist der Code den ich dafür verwende:

Main-Form
Code:
using System;
using System.Drawing;
using System.Windows.Forms;

namespace FileInitializer
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Drive.getDrives();
            int y = 12;
            foreach(Drive drive in Drive._driveLst)
            {
// drive enthält bei mir alle laufwerke 
                Button btn = new Button();
                btn.Text = drive.Label + " (" + drive.Name + ")";
                btn.AutoSize = true;
                btn.Location = new Point(5, y);
                y = y + btn.Height;
                tabPage3.Controls.Add(btn);
            }
        }
    }
}
Drive-Klasse
Code:
using System.Collections.Generic;
using System.IO;
using System.Management;

namespace FileInitializer
{
    public class Drive
    {
        public string Name;
        public string Label;
        public double TotalSize;
        public string TotalSizeStr;
        public double FreeSize;
        public string FreeSizeStr;
        public string SN;

        private static List<Drive> driveLst;
        public static List<Drive> _driveLst
        {
            get { return driveLst; }
            set { driveLst = value; }
        }

        public static void getDrives()
        {
            driveLst = new List<Drive>();
            DriveInfo[] drives = DriveInfo.GetDrives();
            foreach (DriveInfo drive in drives)
            {
                if (drive.IsReady)
                {
                    createDrive(drive.Name,
                        drive.VolumeLabel,
//
//                        Check.systemSize(drive.TotalSize),
//                        Check.sizeName(drive.TotalSize),
//                        Check.systemSize((drive.TotalSize - drive.TotalFreeSpace)),
//                        Check.sizeName((drive.TotalSize - drive.TotalFreeSpace)), 
//--- ka wozu - sieht erstmal doof aus
                        getHDDSN(drive.Name));
                }
            }
        }

        private static void createDrive(string name, string label, double tsize, string tsizestr, double fsize, string fsizestr, string sn)
        {
            Drive d = new Drive();
            d.Name = name;
            d.Label = label;
            d.TotalSize = tsize;
            d.TotalSizeStr = tsizestr;
            d.FreeSize = fsize;
            d.FreeSizeStr = fsizestr;
            d.SN = sn;
            driveLst.Add(d);
        }

        public static string getHDDSN(string drive)
        {
            if (drive == "" || drive == null)
                drive = "C";

            ManagementObject disk = new ManagementObject("Win32_LogicalDisk.DeviceID=\"" + drive + ":\"");
            disk.Get();
            return disk["VolumeSerialNumber"].ToString();
        }
    }
}
ich würde dir empfehlen den Konstruktor zu benutzen um die Liste in der Drive Klasse zu initialisieren ( es sei denn du brauchst es On-Demand )
Edit: schau mal in deinen Debugger wo die Daten verloren gehen
10/07/2015 21:06 Cotigo#3
Okay Thema hat sich erledigt. Es war ein Fehler beim Management Import von der Funktion getHDDSN. Der hat bei drive.Name die Laufwerke mit C:\ ausgeworfen was der bei WMI nicht kennt und deswegen hat der nix gemacht.

Danke dir für die Hilfe und den Tipp mit dem Debugger ;)