Laden...

Namespace mit Klassen aus separater Datei nutzen

Erstellt von jodahush vor 2 Jahren Letzter Beitrag vor 2 Jahren 389 Views
J
jodahush Themenstarter:in
23 Beiträge seit 2021
vor 2 Jahren
Namespace mit Klassen aus separater Datei nutzen

Hallo zusammen,

ich habe seit langem wieder mal ein C# Projekt gestartet und hänge an den Basics.
Zuerst möchte ich nach Rechnertausch ein altes Programm von mir ("DirSize3") ans Laufen bekommen. Der Code unten ist richtig (lief ja schon mal) aber die aufgerufene Methode wird nicht gefunden.

In dem Fall geht es darum, einen namespace aus einer externen Datei zu nutzen.
Ich habe den Code für einen Listview in das man Controls einsetzen kann.
Die Datei heißt "ListViewEx.cs".

Zuerst mal muss sie in das Projekt. Habe das mit: (rechtsklick / hinzufügen / vorhandenes Element) gemacht. (Richtig? Geht es auch besser?)
In der Datei ist der Namespace "ListViewEmbeddedControls".

Wo muss ich jetzt welche using direktive reinschreiben, damit das Program im namespace DirSize3 den Inhalt von ListViewEx auch nutzt?
Bei Eingabe von using ListV.... gibt mir Intellisense schon den Namespace ListViewEmbeddedControls zurück.
Ich dachte soweit wäre es richtig, aber am Ende klappt es trotzdem nicht.

A


        private void AddLVItem(int key, string name, int value)
        {
            ListViewItem lvi = new ListViewItem();
            ProgressBar pb = new ProgressBar();

            lvi.SubItems[0].Text = name;
            lvi.SubItems.Add(value.ToString());

            listView1.Items.Add(lvi);
            pb.Value = value;

            listView1.AddEmbeddedControl(pb, 2, key);

        }

ber die Methode "AddEmbeddedControl" in ListViewEmbeddedControls ruft er nicht auf.

Schweregrad Code Beschreibung Projekt Datei Zeile Unterdrückungszustand
Fehler CS1061 "ListView" enthält keine Definition für "AddEmbeddedControl", und es konnte keine zugängliche AddEmbeddedControl-Erweiterungsmethode gefunden werden, die ein erstes Argument vom Typ "ListView" akzeptiert (möglicherweise fehlt eine using-Direktive oder ein Assemblyverweis). DirSize3 C:\Users\abcd\source\repos\DirSize3\Form1.cs 210 Aktiv

16.827 Beiträge seit 2008
vor 2 Jahren

Deine Entwicklungsumgebung, ich nehme an, dass Du Visual Studio verwendest, gibt Dir auch Lösungshilfen bei solchen Fehlern.
Siehe C# Compiler messages sowie [Hinweis] Syntaxfehler selbst lösen (Compilerfehlermeldungen)
Das using wäre daher der richtige Weg.

ListViewEmbeddedControls ist ein ungewöhnlicher Name für einen Namespace.
Aber ist das der Namespace, in der die Deklaration bekannt gemacht werden kann, dann funktioniert das über ein using.
Geht das trotzdem nicht, dann ist die Deklaration womöglich wo anders. An dem Code hier ist aber nicht zu erkennen wo.

J
jodahush Themenstarter:in
23 Beiträge seit 2021
vor 2 Jahren

Danke,
zumindest weiß ich dann woran es nicht liegt.

Hintergrund:
Es gab wohl eine Komponente auf Basis Listview, mit der man Schaltelemente (in meinem Fall hatte ich eine Progressbar genutzt) einbinden konnte. Den Code meines Programms habe ich noch am anderen Rechner gefunden, aber eben nicht das ganze Projekt. Jetzt habe Methode für Methode in ein neues leeres Projekt gesetzt.

Der Code für das Listview dazu war namespace ListViewEmbeddedControls. Dort findet man auch die relevante methode.

Ich denke ich muss ich ListViewEx als eigenes KontrollElement registrieren?

4.938 Beiträge seit 2008
vor 2 Jahren

Schau (oder zeige uns) mal die Zeile, in der die Klasse in "ListViewEx.cs" deklariert wird.
Bei einer statischen Klasse (static) handelt es sich wohl um Erweiterungsmethoden. Ich denke aber, daß dort die Klasse ListViewEx (von ListView abgeleitet) deklariert wird, so daß du dann auch auf dem Formular diese ListViewEx-Komponente (statt der Standard-ListView) verwenden mußt.

J
jodahush Themenstarter:in
23 Beiträge seit 2021
vor 2 Jahren

Okay danke, das werde ich morgen versuchen heute bin ich nicht mehr an dem Rechner.
Ich kann nicht die ganze Datei hochladen

J
jodahush Themenstarter:in
23 Beiträge seit 2021
vor 2 Jahren

Ich muss noch einen Schritt ausholen. Das reine Code klappt einigermaßen, aber die VS Umgebung ist für mich halt noch sehr kryptisch, zumal ich nur gelegentlich Programmiere.

Hintergrund:
Beim Rechnerupdate habe ich den größten Teil meiner C# Programme (repos auf c:\ 😭 )verloren.
DirSize war aber ziemlich nützlich, so wollte ich es nochmal anpacken.
Zum Glück habe ich noch ein Zip Archiv mit dem Code von DirSize2 (so nenne ich das Ding) gefunden.

Unzipen, VS öffnen, Starten => Dann hat VS den Namespace durch einen Platzhalter ersetzt. Ich habe versucht alle Platzhalter durch DirSize2 zu ersetzen aber irgendwann steckte ich dann auch bei zwei Fehlern in der Ressourcen Datei fest. Hier kann ich die Form1 nicht aufrufen, ohne Komponenten zu verlieren 😦 Daher finde ich auch die Deklaration der ListViewEx nicht. Dein Hinweis scheint aber den Punkt zu adressieren.

Anderer Versuch alles neu machen. Methode für Methode per copy paste einsetzen. Auch dort blieb ich bei der ListViewEx Komponente hängen.

Eigentlich sollte ich jetzt zuerst mal probieren, in eine blanke Form, ListViewEx als Child von ListView zu installieren. Wie auch immer. Ich weiß nicht mehr wie ich es damals hinbekommen habe, daher muss ich nochmal von vorne einsteigen.

Ich habe daher den Code (als zip) angehängt. Da ist alles drin. Das Programm und die Komponente. Vielleicht gibt es bessere Wege hier zum Ziel zu kommen.

J
jodahush Themenstarter:in
23 Beiträge seit 2021
vor 2 Jahren

Also der Versuch eine ListViewEx in die Komponenten Toolbox einzubinden.

Neues Projekt
Vorhandenes Element hinzufügen
ListViewEx auswählen
ListViewEx.cs erscheint dann im ProjektmappenExplorer

In der Toolbox steht .... Nichts!
Dann habe ich folgenden Code in Form1.cs eingegeben und einmal gestartet:


using System.Windows.Forms;
using ListViewEmbeddedControls;

namespace TestLVex
{
    public partial class Form1 : Form
    {
        private ListViewEx ListView1;

        public Form1()
        {
            InitializeComponent();
        }

Dann plötzlich erscheint wie durch ein Wunder in meinem Test Program TestLVex in der Toolbox die ListViewEx komponente, die ich dann wie jede andere Komponente auf die Form ziehen kann.

Deklaration Listbox1 = new ListBoxEx oder sowas Fehlanzeige.
Irgendwie macht VS etwas intelligentes im Hintergrund, um die Komponente visual sichtbar zu machen, dass ich manuell nicht erkennen kann.

Über diesen Weg bekomme ich mein Programm wieder ans laufen, aber irgendwie muss ich wohl die "using" Geschichte noch besser verstehen.

16.827 Beiträge seit 2008
vor 2 Jahren

Irgendwie macht VS etwas intelligentes im Hintergrund, um die Komponente visual sichtbar zu machen, dass ich manuell nicht erkennen kann.

Ist irgendwo in den Docs beschrieben; ich finds gerade nicht:
Die Toolbox ergibt sich aus dem aktuellen Kompilat. Sprich, Du musst Deine Anwendung bauen, danach baut VS seinen Cache auf bzw. aktualisiert diesen (im .vs Ordner der Solution/Projekt).
Danach taucht das Zeug auf; egal ob das nun eine Toolbox ist oder andere Dinge in der IDE.

Man muss aber auch sagen, dass man sowas wie die Toolbox eher als Anfänger verwendet als in der professionellen, fortgeschrittenen Welt.
Da verwendet man solche IDE Hilfsmittel eher sehr selten bis gar nicht.

aber irgendwie muss ich wohl die "using" Geschichte noch besser verstehen.

Ganz neutrale Bewertung: ich denke, dass da allgemein die Grundlagen noch nicht sitzen 😉
Kommt aber alles mit der Zeit, man muss nur Zeit reinstecken.

4.938 Beiträge seit 2008
vor 2 Jahren

Der gesamte Buildvorgang muß einmal fehlerfrei kompiliert werden, damit die Komponente in der ToolBox auftaucht.

Dann läuft jetzt hoffentlich dein Projekt?!
Und verwende demnächst ein Backup-System oder gleich ein Versionskontrollsystem (z.B. Git).

J
jodahush Themenstarter:in
23 Beiträge seit 2021
vor 2 Jahren

yep, danke an euch.
Zur IDE, soll man später alle Komponenten zur Laufzeit erstellen? Wäre mir zu aufwändig. Für die Oberfläche und zur Wiederbenutzung sind doch genau solche Sachen, wie auch die Code Snippets z.B. prop Tab Tab.

Aber prima, es läuft jetzt.
Und ja, ich habe schon die ersten Backups gestreut.
Blöd ist dabei nur, das man Code anscheinend nicht per mail verschicken kann weil da ein Virus drin sein könnte. Daher Backup in oneDrive

16.827 Beiträge seit 2008
vor 2 Jahren

Zur IDE, soll man später alle Komponenten zur Laufzeit erstellen? Wäre mir zu aufwändig. Für die Oberfläche und zur Wiederbenutzung sind doch genau solche Sachen, wie auch die Code Snippets z.B. prop Tab Tab.

In der Regel passiert das in größeren, mächtigeren Anwendungen zur Laufzeit, ja.
In Windows Form durchaus oft sogar mit eigener Positionsberechnung; in WPF mit XAML funktioniert das über Bindings etwas einfacher.