Laden...

Wie könnt es gehen?? asp.net wie Access-Unterformular

Erstellt von Tott666 vor 17 Jahren Letzter Beitrag vor 17 Jahren 2.896 Views
Tott666 Themenstarter:in
186 Beiträge seit 2005
vor 17 Jahren
Wie könnt es gehen?? asp.net wie Access-Unterformular

Hallo zusammen,

ich möchte folgendes machen:

Eine Suchseite, die dann zeilweise mein ergebnis anzeigt, jedoch nicht mit einem Datagrid, da ich gerne einen anderen Aufbau haben möchte:

Links großes Bild (über mehrere Zeilen)
rechts danaben verschiedene Text/Labelfelder mit angaben
rechts davon wiederum einen Button mit Link auf Detail-Seite
So in der Art wie die angehängte datei.

Die Suche zu machen ist nicht das Thema, auch nicht dort einen SQLReader oder Dataset raus zu bekommen, nur wie bekomme ich die jeweilige anzeige hin.

Ich dachte an eine ascx-Datei, nur wie kann ich diese wiederrum mit der Hauptform verknüpfen, so das dort der Datensatz xy aufgerufen wird und beim nächsten mal der Datnsatz yz.

Ich hoffe ihr versteht was ich möchte und könnt mir helfen, im moment steh ich total auf der Leitung 🙁

Greets Tott

PS:
Programiere asp.net in vb

Ich weiß, dass ich nichts weiß 8)

3.170 Beiträge seit 2006
vor 17 Jahren

Hallo,
falls Du das meinst:
In der Hauptseite
<%@ Reference Control="path/to/myControl.ascx" %>

EDIT: Hatte die "%" vergessen

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

Tott666 Themenstarter:in
186 Beiträge seit 2005
vor 17 Jahren

Ja,
soweit ist das klar, aber wie bekomme ich das x-mal geladen, für je einen Datensatz und wie gekomme ich die verknüpfung hin zu dem anzuzeigenden Datensatz???

Ich weiß, dass ich nichts weiß 8)

3.170 Beiträge seit 2006
vor 17 Jahren

Indem du x Tags dafür erstellst, jedes davon wird ein Item der Controls der Hauptseite, und du hast sogar für jedes einen Member in der Page, heißt wie die ID des Tags.

EDIT:
Jede Control hat dann wieder eine Controls-Collection, da müsstest Du dann auch den Button finden.

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

Tott666 Themenstarter:in
186 Beiträge seit 2005
vor 17 Jahren

Entweder hab ich dich nicht richtig verstanden, oder wir reden aneinander vorbei.

Meines wissens nach kann man keine Objekte zur laufzeit erstellen unter asp.net und ich habe auch noch nicht die Datenbindung bei der ascx-Datei zu dem jeweiligen Datensatz mit der ID 4711.

Hast du evtl. eine Seite wo man sich das ganze mal als beispiel ansehen kann, so wie du es meinst??

Ich weiß, dass ich nichts weiß 8)

3.170 Beiträge seit 2006
vor 17 Jahren

Du kannstdie Tags ja auch in einer Schleife erzeugen. Dann kannst du Deiner Control jeweils einen DataRow-Member verpassen und beim erzeugen übergeben. Die Control sollte selbst das Wissen darüber beinhalten, welche der Daten der Row sie wo anzeigen soll.

EDIT: Du kannst die Control auch zur Laufzeit erzeugen, wo hast du denn das her das dasnicht geht?

MyControl myControl =newMyControl();

myTag.Controls.Add(myControl)

im richtigen Tag: Du bekommst in der Page einen Member vom Typ Control für jedes Tag dem Du ein runat="server" alsAttribut verpasst.

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

Tott666 Themenstarter:in
186 Beiträge seit 2005
vor 17 Jahren

Also, was ich jetzt hin bekommen habe sind die ascx zu laden:

        
Dim i As Int16
Dim ctl As Control

For i = 1 To 5
            ctl = Me.LoadControl("./Module/Suche.ascx")
            ctl.ID = "Ctl_0" & i
            Me.PlaceHolder1.Controls.Add(ctl)

Next i


Nur habe ich jetzt das Problem, wie bekomme ich die einzelnen txt-Felder angesprochen um ihnen unterschiedliche Werte zuzuweisen?

ODER

Wie kann ich in der ascx-Datei erkennen welche ID das Objekt hat.

Danke für weitere Hilfe

Ich weiß, dass ich nichts weiß 8)

3.170 Beiträge seit 2006
vor 17 Jahren

Das "LoadControl" kannst Du Dir eigentlich sparen, wenn Du die Control so instanzierst, wie in meinem letzten Post beschrieben.
Die ID's innerhalb der Control bauen sich auf aus dem Namen, den du in der ascx-Datei für die Kontrollen vergibst, allerdings normalerweise mit einem Prefix, das sich über den "NamingContainer" der Control und den IdSeparator zurückverfolgen lässt.
Den Zugriff auf die Elemente innerhalb der Page betrifft das normalerweise nicht, du kannst normal über myControl.mySubControlId (so einen Member müsste es geben) zugreifen. Wie die Control dann auf dem Client heißt, verrät Dir die Property myControl.ClientId. Dies musst du zum Beispiel abfragen wenn du von der Control gepostete Parameter entgegennehmen willst.

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

Tott666 Themenstarter:in
186 Beiträge seit 2005
vor 17 Jahren

Hi,

kannst du mir evtl. die Zeile von dir in VB übersetzen?
Da hänge ich im moment dran, weil ich da keinen Kopf rein bekomme 🙁

MyControl myControl =newMyControl();

Danke für die Hilfe

Tott

Ich weiß, dass ich nichts weiß 8)

3.170 Beiträge seit 2006
vor 17 Jahren

Sorry habe auch ein Leerzeichenvergessen. die Zeile sollte heißen:

MyControl myControl = new MyControl()

das wäre in VB etwa

Dim myControl As MyControl

wobei MyControl der Klassenname Deiner Control ist.

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

Tott666 Themenstarter:in
186 Beiträge seit 2005
vor 17 Jahren

Jetzt habe ich erst verstanden was du meinstest, durch deine mycontrol´s kam ich etwas durcheinander.

nur habe ich jetzt das problem, dass er es wohl macht (erkannt durch einzelschritte im debug) jedoch zeigt er sie nicht an. 🙁

wenn ich die eigenschaften prüfe bekommt jeder eine eigene uniqueid und alle sind visible = true, aber sehen kann ich sie trotzdem nicht 🙁

Hier der Code, der ja recht einfach ist (nußte new mit einbinden, sonst bekam ich Fehlermeldung)


            Dim i As Int16

            For i = 1 To 5
                Dim ctl As New ACR.modKFZSuche
                Me.phSuche.Controls.Add(ctl)
            Next i

Hier die Eigenschaften, wenn ich im Befehlsfenster nachfrage zur Laufzeit:


? ctl
{ACR.ACR.modKFZSuche}
    _page: {ASP.KFZ_Suche_aspx}
    Application: {System.Web.HttpApplicationState}
    Attributes: {System.Web.UI.AttributeCollection}
    AutoHandlers: 0
    BindingContainer: {ASP.KFZ_Suche_aspx}
    btn_Detail: Nothing
    Cache: {System.Web.Caching.Cache}
    ChildControlsCreated: False
    ClientID: "_ctl3"
    Context: {System.Web.HttpContext}
    Controls: {System.Web.UI.ControlCollection}
    designerPlaceholderDeclaration: Nothing
    EnableViewState: True
    Events: {System.ComponentModel.EventHandlerList}
    HasChildViewState: False
    ID: Nothing
    ID_SEPARATOR: ":"c
    Image1: Nothing
    IsPostBack: True
    IsTrackingViewState: True
    Label1: Nothing
    Label2: Nothing
    Label3: Nothing
    Label4: Nothing
    Label5: Nothing
    Label6: Nothing
    Label7: Nothing
    NamingContainer: {ASP.KFZ_Suche_aspx}
    Page: {ASP.KFZ_Suche_aspx}
    Parent: {System.Web.UI.WebControls.PlaceHolder}
    Request: {System.Web.HttpRequest}
    Response: {System.Web.HttpResponse}
    Server: {System.Web.HttpServerUtility}
    Session: {System.Web.SessionState.HttpSessionState}
    Site: Nothing
    SupportAutoEvents: True
    TemplateSourceDirectory: "/ACR"
    TextBox1: Nothing
    TextBox2: Nothing
    TextBox3: Nothing
    TextBox4: Nothing
    TextBox5: Nothing
    TextBox6: Nothing
    Trace: {System.Web.TraceContext}
    txtAA: Nothing
    UniqueID: "_ctl3"
    ViewState: {System.Web.UI.StateBag}
    ViewStateIgnoresCase: False
    Visible: True

welche eigenschaft fehlt mir noch, ich denke es dürfte nur noch eine Kleinigkeit sein.

Thanks Tott

Ich weiß, dass ich nichts weiß 8)

3.170 Beiträge seit 2006
vor 17 Jahren

Hm ich kann eigentlich nichts auffälliges erkennen. Vielleicht ist Me.phSuche nicht visible, oder auch dynamisch erzeugt aber nicht in die Controls der Seite gepackt?

Sonst versuch mal statt Deinem eigenen Control irgenwas anderes hizuzufügen, z.B. Buttons oder so. Und dann sag mal Bescheid, ob die sichtbar werden. Wenn ja, liegt's wahrscheinlich irgendwo in der Control selbst...

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

Tott666 Themenstarter:in
186 Beiträge seit 2005
vor 17 Jahren

phSuche ist visible = true und die ascx wurden auch angezeigt als ich das über meinen ersten weg versucht habe, also kann es dadran eigentlich auch nicht liegen.

auf der ascx liegen auch textfelder und ein button, die müßten erscheinen.

Ich weiß, dass ich nichts weiß 8)

3.170 Beiträge seit 2006
vor 17 Jahren

Keine Ahnung warum das so nicht funktioniert. Ich kenne mich allerdings auch nicht so gut mit VBausaber hier dürfte die Sprache eigentlich keineRolle spielen. Die Objekte werden ja auch erstellt...
Aber wennsmit LoadControl funktioniert hat, kannst Du jaauch damit arbeiten.
Was die angezeigten Daten angeht:
Ein Member vom Typ DataRow in der Control (also deinen eigenen DataRow-Typen), und eine Set-Property dafür. In der Set-Property kannst Du dann die Textboxen besetzen.
Oder einfach eine Set-Methode die die DataRow als Parameter annimmt.

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

379 Beiträge seit 2004
vor 17 Jahren

@Tott666: Du könntest statt einem UserControl natürlich auch einen Repeater oder eine DataList verwenden. Dort kannst du eine Tabelle verwenden die du nach deinen wünschen gestalten kannst und die Datenbindung ist auch ganz einfach.
Kannst es dir ja mal anschauen 😉

cioa Anke

1.130 Beiträge seit 2005
vor 17 Jahren

Genau, gibt es einen Grund warum hiefür der Umweg über ein UserControl gegangen wird?

Selbst wenn Du tatsächlich ein UserControl verwenden möchtest, würde es mehr Sinn machen in dem UserControl einen Repeater zu verwenden. Du instanzierst das Control dann nur ein einziges Mal.