2009-10-28 11 views
5

Ich bin ein 1.1-Projekt in 2.0 konvertieren und habe ein Problem mit einigen Benutzersteuerelementen.UserControls in der Klassenbibliothek

Im ursprünglichen Projekt gab es ein Klassenbibliotheksprojekt und das Website-Projekt. Im Klassenbibliotheksprojekt gab es einen Ordner namens UserControls und darin befanden sich mehrere ASCII-Dateien und deren Code hinter den Dateien.

Ich möchte die gleiche Struktur behalten, also bringe ich diese Benutzersteuerelemente in meine neue Lösung in einem separaten Klassenbibliotheksprojekt ein. Ich änderte es von einer vollständigen Klasse in eine partielle Klasse und änderte den CodeBehind in CodeFile der Seite.

Im alten Benutzersteuerung, alle Web-Steuerelemente in der Benutzerverwaltung aufgelistet wurden wie

protected System.Web.UI.WebControls.DropDownList _findModeList; 

usw.

ich damit .net 2 ist gedacht folgt und mit der Codefile statt Attribut, Ich brauche das vielleicht nicht, aber es kompiliert nicht, wenn ich es weglasse.

Allerdings, wenn ich es einschließe, kompiliert es, aber ich bekomme "Objektreferenz nicht auf eine Instanz eines Objekts festgelegt." Fehler beim Versuch, _findModeList in der Codedatei zu verwenden.

Ist es möglich, Benutzersteuerelemente in einer Klassenbibliothek in .net 2.0 aufzustellen?

Antwort

3

Nicht wirklich. Die .ASCX-Datei sollte in jedem Webanwendungsprojekt enthalten sein, das sie verwendet. Um Duplikate zu vermeiden, können Sie das UserControl im Ordner Ihrer Klassenbibliothek speichern und die Funktion "Als Link hinzufügen" von Visual Studio verwenden.

Wählen Sie "Add Existing Item" im Kontextmenü Ihrer Web Application, wählen Sie das Benutzersteuerelement aus und klicken Sie auf den Pfeil in der Schaltfläche und wählen Sie "Add As Link".

1

Arbeiten Sie mit einem Webanwendungsprojekt? Oder eine Website? Es ist verwirrend, ich weiß ...

Wenn Sie mit einem WAP arbeiten, verwenden Sie CodeFile und lassen ASP.NET die .designer.cs-Dateien für Sie generieren. Deklarieren Sie die Objekte nicht aus Ihrer .acsx. Sie deklarieren eine neue/andere DropDownList, wenn Sie _findModeList explizit in der von CodeFile referenzierten CS-Datei deklarieren. Deshalb erhalten Sie die Nullreferenz ... sie wurde nicht initialisiert. Wenn Sie keine .designer-Datei haben, klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf .ascx und klicken Sie auf "In Webanwendung konvertieren".

Wenn Sie mit einer Site statt mit einem WAP arbeiten, verwenden Sie das CodeBehind-Attribut. Es funktioniert weiterhin wie in ASP.NET 1.1 und kompiliert im laufenden Betrieb.

Um ein Steuerelement vollständig in einer DLL zu leben ... verwenden Sie "benutzerdefinierte Steuerelemente" anstelle von Benutzersteuerelementen. Wiederum, verwirrend.

1

Eigentlich können Sie erstellen versuchen, neue Web Application Projekt nicht neu erstellen Web Site, weil zwischen diesen beiden unterschiedlichen Projekt sind.

Nachdem Sie die Webanwendung erstellt haben, erstellen Sie einfach Ihr Benutzersteuerelement (.ascx). Danach können Sie versuchen, Ihre Webanwendung neu zu erstellen. Nachdem Sie fertig sind, können Sie zu Ihrem bin-Verzeichnis navigieren, dort sollte DLL für Ihre Webanwendung sein. Jetzt können Sie diese DLL in einem anderen Website/Web-Anwendungsprojekt verwenden. Fügen Sie einfach einen Verweis auf diese DLL hinzu.

1

Haben Sie versucht, das Inherits-Attribut im <% @ Control%> -Tag zu ändern/hinzuzufügen?

<%@ Control Language="C#" CodeBehind="<PathToTheFile>" Inherits="namespace.and.classname" %> 
Verwandte Themen