Laden...

Forenbeiträge von RocketRoN Ingesamt 13 Beiträge

21.12.2011 - 14:26 Uhr

Wie LINQ2SQL funktioniert weis ich, das war auch nicht meine Frage. Du sagtest, ich soll den DataContext neu erstellen, jetzt würde ich gern wissen, wie ich das in der von mir gezeigten Klasse mache?


[Database(Name="xxx")]
public class Catalog : DataContext
{
    public Catalog() : base("Data Source=xxx; Initial Catalog=xxx; Integrated Security=no; User ID=xxx; Password=xxx") { }

    /// <summary>
    /// Tabelle für Abteilungen
    /// </summary>
    public Table<Abteilung> Abteilungen;
}

denn der DataContext wird ja vererbt und wird automatisch erstellt, wenn ich die Klasse Catalog instanziere.

21.12.2011 - 14:16 Uhr

erstell einfach den DataContext neu

der DataContext wird neu erstellt, wenn ich eine neue Klasse Catalog instanziere. bzw. wie soll ich einen neuen DataContext in der Klasse Catalog erstellen? Ich steh grade aufm Schlauch. Hast Du eventuell paar Zeilen Code für mich?

Grüße RocketRoN

21.12.2011 - 13:54 Uhr

verwendetes Datenbanksystem: MSSQL Server 2005 Standard

Hallo Leute,

folgende Ausgangssituation: ich habe eine Klasse für die Verbindung zur Datenbank mit LINQ erstellt, welche auch so funktioniert.

Catalog.cs


[Database(Name="xxx")]
public class Catalog : DataContext
{
    public Catalog() : base("Data Source=xxx; Initial Catalog=xxx; Integrated Security=no; User ID=xxx; Password=xxx") { }

    /// <summary>
    /// Tabelle für Abteilungen
    /// </summary>
    public Table<Abteilung> Abteilungen;
}

Um jetzt auf die Datenbank, bzw. auf die Tabellen zuzugreigen muss ich lediglich noch die Klasse instanzieren. Das funktioniert auch alle soweit super.

Nun zu meinem Problem:
Ich möchte die Verbindungsdaten nicht hart im Code hinterlegen, sondern vorher aus einer XML-Datei auslesen. Das ist auch kein Problem, aber wie kann ich im nachhinein die Verbindungsdaten des DataContext ändern.
Folgende Idee funktioniert leider nicht komplett:

Catalog.cs


public class Catalog
{
    public Catalog()
    {
        // Auslesen der Verbindungsdaten aus der XML-Datei
        DataContext DC = new DataContext("Data Source=" + Server + " ; Initial Catalog=" + Datenbank + " ; Integrated Security=no; User ID=" + Benutzer + " ; Password=" + Passwort + " ");
                    
        Abteilungen = DC.GetTable<Abteilung>();
    }

Das Problem ist, das ich zwar nach der Instanzierung der Klasse auf die Datenbank zugreifen kann, aber alle wichtigen Funktionen der DataContext-Klasse stehen nicht zur Verfügung, da ich diese nicht vererbt habe. Vererbe ich aber diese Klasse, muss ich die Verbindungsdaten im Konstruktur definieren, was mir nicht erlaubt diese vorher aus einer XML-Datei auszulesen.

Hat jemand eine Idee, wie ich das lösen könnte?

Grüße RocketRoN

21.10.2011 - 13:14 Uhr

Hallo,
ich habe eine Frage zur Layoutgestalltung für komplexe Anwendungen. Derzeit arbeite ich an einem etwas größerem Programm was sich in zwei Bereiche aufteilt. Zum Einen in einen Naviagtionsbereich, welcher auf der Linken Seite ist und zum Anderen in einen Modulbereich, wo sich für verschiedenste Module Formularbestandteile befinden.

Das ganze habe ich derzeit so gelöst, das ich auf der linken Seite Navigationsbuttons habe. Auf der rechten Seite sind dann alle Module auf jeweils einem separatem Panel dargestellt. Der Wechsel zwischen den einzelnen Modulen erfolgt dann durch Sichbar-machen des gewünschten Modul und Unsichtbar-machen aller anderen Module. Das ist keine elegante Lösung, deshalb würde ich das gern anders lösen.

MDI wäre noch ein Ansatzpunkt, doch leider habe ich keine Möglichkeit gefunden der MDI-Bereich anzupassen. Dieser geht nur über die komplette Form zu Hinterlegen. Somit habe ich keine Möglichkeit mein Naviagtionsmenü auf der linken Seite anzuzeigen.

Gibt es noch andere, bessere Lösungsansätze für diese Problemstellung?

Grüße RoN

28.02.2011 - 11:58 Uhr

Die Page.Request.Params hilft mir da weiter, nur leider funktioniert das ganze mit MS-Ajax ne so, wie ich mir das vorstelle. Werde mir bei Gelegenheit mal JQuery anschauen. Hab zu diesem Thema nur leider noch garkeinen Plan.

28.02.2011 - 11:52 Uhr

Wie kann man das ganze denn nun Lösen?
Bei mir kommt auch die gleiche Fehlermeldung, habe das gleiche Problem.

Grüße RocketRoN

25.02.2011 - 07:29 Uhr

UpdatePanels können auch Controls erhalten und das würde dann so aussehen:

Das ist nicht das Problem, das habe ich alles schon soweit gelöst.

Gibt es, aber Performananz und Seitensource-Quelltext werden mit MS-Ajax immer grösser. Alternativ würde ich Dir raten JQuery und JQueryTemplates anzuschauen.

Das ist eine Idee, werd ich mir mal anschauen.

Ich habe aber trotzdem noch eine Frage.

Bei einer ganz normalen OnClick()-Methode kann ich die objekt Variable auswerten, um herauszufinden, welches Control den Request ausgelöst hat.
z.B.:


protected void Button1_Click(object sender, EventArgs e)
{
   Button Test = (Button)sender;
}

In der OnInit()-Methode bekomme ich aber nur ein Page-Objekt zurück. Kommt man in der OnInit()-ethode trotzdem irgendwie an das Control, was den Request ausgelöst hat? Denn irgendwie wird das Objekt ja mit übergeben, denn sonst könnte man es ja nicht in der, zeitlich vom Ablauf her, späteren Methode auswerten.

Grüße RocketRoN

24.02.2011 - 12:03 Uhr

Den Artikel hab ich schon gelesen. Nur ich möchte eine geschachteltes UpdatePanel in CodeBehind auf Grund eines Ereignisses erstellen und nicht in der aspx-Datei von Anfang an angeben. Wie das geht weis ich.

Nur wenn ich ein Updatepanel im CodeBehind auf ein Ereignis hin erstelle, bzw einem bestehendem Control hinzufüge, dann ist dieses UpdatePanel, wenn ich auf dessen Trigger klicke, wieder weg (siehe Code oben).

Wenn ich das UpdatePanel, was auf ein Ereignis hin einem Control hinzugefügt werden soll, in der OnInit Methode der Page initialisiere, dann funktioniert es. Zum tatsächlichen Anzeigen des UpdatePanels nutze ich dann die Visible-Eigenschaft.

Das hat aber leider einen Hacken. Ich erstelle dieses UpdatePanel auf Grundlage einer Datenbankabfrage, und da die OnInt() Methode bei jedem Ajax-Aufruf aufgeführt wird, erfolgt auch der Datenbankzugriff bei jedem Ajax-Aufruf, obwohl dieses UpdatePanel unberührt bleibt.

Gibt es eine Möglichkeit das eleganter zu Lösen um unnötige Ladezeit zu verkürzen und den Traffic zum Datenbankserver zu minimieren?

Grüße RocketRoN

23.02.2011 - 09:02 Uhr

In welchem OnInit()? Für welches Control?
Wenn ich den Code in die Page_Init einbinde, dann habe ich den zweiten Button immer da und nicht auf das Ereigniss des ersten Buttons hin.

23.02.2011 - 07:13 Uhr

Da sich diese Seite, auf der sich das UpdatePanel befindet, auf eine geschachtelte Master-Seite bezieht, kann ich nicht so einfach auf den ScriptManager zugreifen. Der ScriptManager befindet sich auf der ersten Master-Seite in der Kette.

Hat jemand ne Idee, wie man auf den ScriptManager, oder überhaupt im Allgemeinen auf ein Element einer geschachtelten Master-Seite, zugreift.

UPDATE:
Den Zugriff auf den ScriptManager habe ich hinbekommen.

probier mal den fremden Button mit ScriptManager.RegisterAsyncPostBackControl zu registrieren

Das Funktioniert leider auch nicht. Gleiche Fehlermeldung.

22.02.2011 - 20:37 Uhr

Hallo,

ich habe ein weiteres Problem mit Updatepanels. In meinem Webprojekt möchte ich in einem Updatepanel, was ich in der .aspx Datei definiert habe ein weiteres UpdatePanel dynamisch über CodeBehind Datei auf Grund eines eintretenden Ereignisses definieren.

TEST.ASPX


<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Test.aspx.cs" Inherits="Workflow.Test" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <asp:ScriptManager ID="ScriptManager1" runat="server" EnablePartialRendering="true"></asp:ScriptManager>
            <asp:UpdatePanel ID="UpdatePanel1" runat="server">
            <ContentTemplate>
                <asp:Panel ID="Panel1" runat="server"></asp:Panel>
            </ContentTemplate>
            <Triggers>
                <asp:AsyncPostBackTrigger ControlID="Button1" EventName="Click" />   
            </Triggers>
        </asp:UpdatePanel>
        <asp:Button ID="Button1" runat="server" Text="Button" OnClick="test2_click" />
    </form>
</body>

TEST.ASPX.CS


namespace Workflow
{
    public partial class Test : System.Web.UI.Page
    {
        protected Label lbl = new Label();

        protected void Page_Load(object sender, EventArgs e) { }
        
        protected void test_click(object sender, EventArgs e)
        {
            lbl.Text = DateTime.Now.ToString();
        }

        protected void test2_click(object sender, EventArgs e)
        {
            // UpdatePanel
            UpdatePanel up = new UpdatePanel();
            up.ID = "up1";
            up.UpdateMode = UpdatePanelUpdateMode.Always;

            // Label
            lbl.ID = "lbl1";

            // Button
            Button btn = new Button();
            btn.ID = "btn1";
            btn.Text = "Update";
            btn.Click += new EventHandler(test_click);

            // Content Template
            up.ContentTemplateContainer.Controls.Add(lbl);

            // Trigger
            AsyncPostBackTrigger tr = new AsyncPostBackTrigger();
            tr.ControlID = "btn1";
            tr.EventName = "Click";
            up.Triggers.Add(tr);

            // Button hinzufügen
            Panel1.Controls.Add(btn);

            // UpdatePanel hinzufügen
            Panel1.Controls.Add(up);
        }
    }
}

Der Erste Button wird beim Laden der Seite angezeigt. Beim Klicken auf diesen wird das ein weiterer Button geladen. Dies funktioniert auch ohne Probleme. Jedoch wird beim Klicken auf den zweiten Button nicht die gewünschte Methode ausgeführt, welche die aktuelle Zeit in einem Label ausgeben soll. Stattdessen verschwindet der zweite Button wieder und ich habe den Zustand, den ich am Anfang hatte, nachdem die Seite geladen wurde.

Was mache ich falsch, bzw was habe ich vergessen zubeacheten?

Grüße RocketRoN

22.02.2011 - 20:10 Uhr

Das kann meinem Verständnis nach nicht funktionieren, das du einen AsyncPostBackTrigger für ein Steuerelement definierst, das nicht in dem gleichen UpdatePanel ist.

Wenn ich in gleichen Content, außerhalb des UpdatePanel, einen Button definiert und diesen als Trigger definiere, dann funktioniert das auch. Der Trigger ist ja dafür da, das man auch Elemente zum Ausführen des Updatepanels außerhalb des Updatepanels definieren kann.

Ich nehme an, das das Element nicht gefunden wird, da es in einem anderen Content liegt.

Hat jemand noch eine Idee?

22.02.2011 - 07:37 Uhr

Hallo,

ich habe ein kleines Problem mit einen UpdatePanel, welches die verschiedenen Trigger, die zum auslösen der AJAX-Anfrage definiert sind, nicht finden kann.

Ich habe in meinem Web-Projekt eine Master-Seite definiert, auf der ich verschienene ContentPlaceHolder gesetzt haben. Nun binde ich diese in die eigentliche Seite nur noch die Contents ein und fülle diese mit Code.

Ich habe in dem einem Code ein UpdatePanel mit ContentTemplate und Triggers.



<asp:Content ID="ContentAnzeige" ContentPlaceHolderID="CPHAnzeige" runat="server">
    <asp:UpdatePanel ID="UPGeschäfte" runat="server" ChildrenAsTriggers="true" UpdateMode="Conditional">
        <ContentTemplate>
            <my:TableSort ID="TSFahrgestellnummer" runat="server" Headline="Fahrgestellnummer" OnHeadlineClick="GetSortierung" />
            <my:TableSort ID="TSKennzeichen" runat="server" Headline="Kennzeichen" OnHeadlineClick="GetSortierung" />
            <my:TableSort ID="TSKundennummer" runat="server" Headline="Kundennummer" OnHeadlineClick="GetSortierung" />
            <asp:Label ID="LblAusgabe" runat="server" Text=""></asp:Label>
        </ContentTemplate>
        <Triggers>
            <asp:AsyncPostBackTrigger ControlID="BtnFilterSetzen" EventName="Click" />
            <asp:AsyncPostBackTrigger ControlID="TSFahrgestellnummer" EventName="HeadlineClick" />
            <asp:AsyncPostBackTrigger ControlID="TSKennzeichen" EventName="HeadlineClick" />
            <asp:AsyncPostBackTrigger ControlID="TSKundennummer" EventName="HeadlineClick" />
        </Triggers>
    </asp:UpdatePanel>
</asp:Content>


Alle Trigger Elemente befinden sich in dem Content, der oben im Quelltext dargestellt ist, bis auf das Trigger Element mit der ControlID: BtnFilterSetzen.


<asp:AsyncPostBackTrigger ControlID="BtnFilterSetzen" EventName="Click" />

Dieses Trigger Element befindet sich in einem anderen Content. Also in einem anderen, auf der Master-Seite definierten, ContentPlaceHolder.


<asp:Content ID="ContentFilteroptionen" ContentPlaceHolderID="CPHFilteroptionen" runat="server">
    <%-- Submit  --%>
    <div class="DivFilterSubmit" runat="server">
        <asp:Button ID="BtnFilterSetzen" runat="server" Text="Filter setzen" OnClick="ShowTable"  />
    </div>
</asp:Content>

Beim Ausführen der Seit kommt dann ein Fehler, das der Trigger mit der ID "BtnFilterSetzen" nicht gefunden werden kann.

Wie kann ich jetzt den Trigger für das UpdatePanel sichtbar und somit ausführbar machen.

Grüße RocketRoN