Laden...

Forenbeiträge von timt Ingesamt 21 Beiträge

08.11.2007 - 21:41 Uhr

Hallo Zusammen,

ich möchte eine kaskadierende Listbox erstellen und komme leider nicht mehr weiter.
Das ganz soll so funktionieren, wie das CascadingDropDownList Control im asp.net AJAX Toolkit.

Ich habe mal eine Seite zum testen erstellt, damit man das Problem sieht, normalerweise werden die 2. und 3. Listbox abhängig vom übergeordneten ausgewähltem Wert befüllt.
Es funktioniert eigentlich fast, nur bei der 3. Listbox bleibt der selektierte Wert nach dem Postback nicht ausgewählt und das SelectedIndexChanged Event wird nicht ausgelöst.

<%@ Page Language="C#" EnableViewState="true" AutoEventWireup="true" %>

<script runat="server">
    private ListBox lb2;
    private ListBox lb3;

    protected void Page_Init(object sender, EventArgs e)
    {
        lb1.Items.Add(new ListItem("a1", "a1"));
        lb1.Items.Add(new ListItem("a2", "a2"));
        lb1.Items.Add(new ListItem("a3", "a3"));
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        lb2 = ph2.FindControl("lb2") as ListBox;
        if (lb1.SelectedValue != null && lb1.SelectedValue != "")
        {
            if (lb2 == null) lb2 = new ListBox();
            lb2.Items.Add(new ListItem(lb1.SelectedValue, lb1.SelectedValue));
            lb2.Items.Add(new ListItem("b1", "b1"));
            lb2.Items.Add(new ListItem("b2", "b2"));
            lb2.Items.Add(new ListItem("b3", "b3"));
            lb2.ID = "lb2";
            lb2.AutoPostBack = true;
            ph1.Controls.Add(lb2);
        }
    }

    protected void Page_LoadComplete(object sender, EventArgs e)
    {
        lb3 = ph2.FindControl("lb3") as ListBox;
        if (lb2 != null && lb2.SelectedValue != null && lb2.SelectedValue != "")
        {
            if (lb3 == null) lb3 = new ListBox();
            lb3.Items.Add(new ListItem(lb2.SelectedValue, lb2.SelectedValue));
            lb3.Items.Add(new ListItem("c1", "c1"));
            lb3.Items.Add(new ListItem("c2", "c2"));
            lb3.Items.Add(new ListItem("c3", "c3"));
            lb3.ID = "lb3";
            lb3.AutoPostBack = true;
            lb3.SelectedIndexChanged += new EventHandler(lb3_SelectedIndexChanged);
            ph2.Controls.Add(lb3);
        }
    }

    void lb3_SelectedIndexChanged(object sender, EventArgs e)
    {
        
    }
</script>

<!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>Kaskadierende Listbox</title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <asp:ListBox ID="lb1" AutoPostBack="true" runat="server" />
            <asp:PlaceHolder ID="ph1" runat="server" />
            <asp:PlaceHolder ID="ph2" runat="server" />
        </div>
    </form>
</body>
</html>

Ich hoffe Ihr könnt mir helfen.

Gruß
timt

24.07.2007 - 13:19 Uhr

Hallo herbivore,

danke für den Tipp, dass war genau was ich brauchte, funktioniert super.

Das ist bestimmt richtig was Du meinst, aber da der Download der Dateien zwar Async in der Klasse startet, aber durch den AutoResetEvent ja "in Reihe" gebracht wird, sollte es doch eigentlich mit dem SynchronizationContext auch korrekt sein?

Gruß
timt

24.07.2007 - 10:36 Uhr

Hallo herbivore,

hätte ich auch selbst drauf kommen müssen, hatte ich im Ansatz ja schon vermutet.

Ich lasse die Download Methode jetzt in einem Extra Thread laufen, was ohne Probleme funktioniert.
Das Event wc_DownloadFileCompleted löst das public event UpdateCompleted aus, welches ich in meiner Form abboniert habe.
Dort aktualisiert das Event eine Progressbar.
Im GUI Thread muss ich jetzt mit InvokeRequired arbeiten, was auch funktioniert.
Ich würde das aber gerne schon in der Update Klasse beim Aufruf von DownloadCompleted in wc_DownloadFileCompleted erledigen, nur wie mache ich das in einer Klasse?

Das ist mein Code aus der GUI Klasse, dort würde ich das InvokeRequired gerne raus haben und das schon in meiner Update Klasse erledigen.

void upd_UpdateCompleted(object sender, UpdateEventArgs updateEventArgs)
        {
if (pbUpdate.InvokeRequired)
            {
                pbUpdate.Invoke(new MethodInvoker(PerformStep));
                return;
            }
            pbUpdate.PerformStep();
}

Update Klasse

        void wc_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
        {
            _are.Set();
            OnUpdateCompleted(new UpdateEventArgs(this._UpdateSize, this._CurrentUpdateSize));
        }
        protected void OnUpdateCompleted(UpdateEventArgs e)
        {
            if (UpdateCompleted != null)
            {
                UpdateCompleted(this, new UpdateEventArgs(e.totalUpdateSize, e.currentUpdateSize));
            }
        }
        public event UpdateCompletedEventHandler UpdateCompleted;

Gruß
timt

23.07.2007 - 22:50 Uhr

Hallo herbivore,

danke für Deinen Tipp... mit dem Beispiel sollte es ja auch eigentlich kein Problem sein, aber irgendwie läuft mein Programm nicht weiter, wenn ich es einbaue.
Es bleibt einfach hängen, keine Exception. Ich könnte es mir damit erklären, dass ich meinen Haupthread mit _are.WaitOne() ja auch "schlafen lege", aber das gleiche passiert in Deinem genannten Beispiel ja auch.

Vielleicht kannst Du mir nochmal auf die Sprünge helfen.
Mein Code sieht jetzt folgendermaßen aus.

private static AutoResetEvent _are;
        private void UpdateFiles(object[] updates, string appName)
        {
            _are = new AutoResetEvent(false);

            WebClient wc = new WebClient();
            wc.Credentials = new NetworkCredential("name", "password");
            wc.DownloadFileCompleted += new AsyncCompletedEventHandler(wc_DownloadFileCompleted);
            wc.DownloadProgressChanged += new DownloadProgressChangedEventHandler(wc_DownloadProgressChanged);

            foreach (object o in updates)
            {
                
                UpdateWS.UpdateInfo ui = (UpdateWS.UpdateInfo)o;
                string file = this._AppPath + ui.Path + ui.Filename;
                if (!System.IO.File.Exists(file) || System.IO.File.GetCreationTimeUtc(file) < ui.LastWriteTime.ToUniversalTime())
                {
                    string downloadpath = this._AppPath + ui.Path;
                    if (!System.IO.Directory.Exists(downloadpath))
                        System.IO.Directory.CreateDirectory(downloadpath);
                    wc.DownloadFileAsync(new Uri("ftp://xxx.de/updates/" + ui.Path.Replace("\\", "/") + ui.Filename), downloadpath + ui.Filename);
                    _are.WaitOne();
                }
            }
        }

        void wc_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
        {
        }
        void wc_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
        {
             _are.Set();
        }

timt

23.07.2007 - 21:01 Uhr

Hallo herbivore,

ich hatte vergessen zu erwähnen, dass ich die Async Methode "brauche", da ich den Download-Fortschritt verfolgen möchte.

timt

23.07.2007 - 20:36 Uhr

Hallo,

ich habe eine Klasse, die mit Hilfe eines WebClients Daten per FTP runterlädt.
Die Daten werden über eine Schleife einzeln nacheinander runtergeladen.
Jetzt habe ich aber das Problem, dass die Schleife weiterläuft wenn sie den Download über die DownloadAsync Methode gestartet hat und eine Exception auslöst wenn der gleiche WebClient noch eine Datei runterladen möchte.

Wie kann ich die Schleife solange warten lassen, bis das Ereignis DownloadCompleted ausgelöst wird?

        private void UpdateFiles(object[] updates, string appName)
        {
            WebClient wc = new WebClient();
            wc.Credentials = new NetworkCredential("name", "password");
            wc.DownloadFileCompleted += new AsyncCompletedEventHandler(wc_DownloadFileCompleted);
            wc.DownloadProgressChanged += new DownloadProgressChangedEventHandler(wc_DownloadProgressChanged);

            foreach (object o in updates)
            {
                
                UpdateWS.UpdateInfo ui = (UpdateWS.UpdateInfo)o;
                string file = this._AppPath + ui.Path + ui.Filename;
                if (!System.IO.File.Exists(file) || System.IO.File.GetCreationTimeUtc(file) < ui.LastWriteTime.ToUniversalTime())
                {
                    string downloadpath = this._AppPath + ui.Path;
                    if (!System.IO.Directory.Exists(downloadpath))
                        System.IO.Directory.CreateDirectory(downloadpath);
                    wc.DownloadFileAsync(new Uri("ftp://xxx.de/updates/" + ui.Path.Replace("\\", "/") + ui.Filename), downloadpath + ui.Filename);
                }
            }
        }

        void wc_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
        {
        }
        void wc_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
        {
        }
}

Danke.
Gruß
Tim

29.06.2007 - 14:49 Uhr

Habe die Lösung gerade selber gefunden.
Die fehlenden Typen haben keinen Setter in der PaymentStatus.
Warum diese Typen deswegen nicht in der WSDL Datei auftauchen ist mir aber nicht ganz klar.

Vielen Dank trotzdem.

Tim

29.06.2007 - 14:16 Uhr

Das hier ist meine PaymentStatus Klasse.
Das Objekt wird beim Aufruf der Methode CaptureEDD() erzeugt und zurückgegeben.

    public class PaymentStatus
    {
        protected PaymentStatus() { }

        public PaymentStatus(Guid payID, Guid xID, Guid reqID, Int64 transID, int amount, string status, string description, Int64 code, string type, DateTime requestDate)
        {
            this._PayID = payID;
            this._XID = xID;
            this._ReqID = reqID;
            this._TransID = transID;
            this._Amount = amount;
            this._Status = status;
            this._Description = description;
            this._Code = code;
            this._Type = type;
            this._RequestDate = requestDate;
        }
        private Guid _PayID;
        public Guid PayID
        {
            get { return _PayID; }
        }
        private Guid _XID;
        public Guid XID
        {
            get { return _XID; }
        }
        private Guid _ReqID;
        public Guid ReqID
        {
            get { return _ReqID; }
            set { _ReqID = value; }
        }
        private Int64 _TransID;
        public Int64 TransID
        {
            get { return _TransID; }
        }
        private int _Amount;
        public int Amount
        {
            get { return _Amount; }
            set { _Amount = value; }
        }
        private string _Status;
        public string Status
        {
            get { return _Status; }
        }
        private string _Description;
        public string Description
        {
            get { return _Description; }
        }
        private Int64 _Code;
        public Int64 Code
        {
            get { return _Code; }
        }
        private string _Type;
        public string Type
        {
            get { return _Type; }
            set { _Type = value; }
        }
        private DateTime _RequestDate;
        public DateTime RequestDate
        {
            get { return _RequestDate; }
            set { _RequestDate = value; }
        }
    }

Tim

29.06.2007 - 13:55 Uhr

Wenn ich den Webservice mit webservice.asmx?WSDL aufrufe, sehe ich in der Beschreibung, dass einige Typen in der Beschreibung des komplexen Typs "PaymentStatus" fehlen.

  • <s:element name="CaptureEDD">
  • <s:complexType>
  • <s:sequence>
    <s:element minOccurs="1" maxOccurs="1" name="payID" type="s1:guid" />
    <s:element minOccurs="1" maxOccurs="1" name="transID" type="s:long" />
    <s:element minOccurs="1" maxOccurs="1" name="amount" type="s:int" />
    <s:element minOccurs="0" maxOccurs="1" name="currency" type="s:string" />
    </s:sequence>
    </s:complexType>
    </s:element>
  • <s:element name="CaptureEDDResponse">
  • <s:complexType>
  • <s:sequence>
    <s:element minOccurs="0" maxOccurs="1" name="CaptureEDDResult" type="tns:PaymentStatus" />
    </s:sequence>
    </s:complexType>
    </s:element>
  • <s:complexType name="PaymentStatus">
  • <s:sequence>
    <s:element minOccurs="1" maxOccurs="1" name="ReqID" type="s1:guid" />
    <s:element minOccurs="1" maxOccurs="1" name="Amount" type="s:int" />
    <s:element minOccurs="0" maxOccurs="1" name="Type" type="s:string" />
    <s:element minOccurs="1" maxOccurs="1" name="RequestDate" type="s:dateTime" />
    </s:sequence>
    </s:complexType>

Tim

29.06.2007 - 12:52 Uhr

Hallo,

ich habe ein merkwürdiges Problem.

Ich habe einen Webservice der mir ca. 10 Funktionen bereitstellt.
Die Funktionen geben unterschiedliche komplexe Objekte zurück, was super funktioniert, nur bei drei Funktionen die mir ein Benutzerdefiniertes Objekt zurück geben, ist die Beschreibung der komplexen Objekte in der automatisch generierten WSDL Datei unvollständig.
In der Beschreibung der komplexen Objekte fehlen einfach einige Objekte, z.B. strings, guids, und ints.

Ich weiß leider gar nicht wo ich mit der Fehlersuche anfangen soll.
Hat jemand einen Tipp für mich?

Gruß
Tim

01.02.2007 - 14:11 Uhr

Hallo Zusammen,

ich habe mir ein kleines Framework geschrieben, dass ich sowohl in einer ASP.NET Anwendung als auch in einer WinForms Anwendung benutzen will.
Einige Klassen benötigen Einstellungen, wie zum Beispiel Mindestpasswortlänge oder Verschlüsselungskey, welche ich in einer Datei abspeichern möchte.
Außerdem möchte ich diese Einstellungen ändern können.

Wo, bzw. wie speicher ich diese Einstellungen am besten ab?
In einer Settings Datei? Wie performat ist es zum Beispiel in der ASP.NET Anwendung, wenn die Einstellungen für jede Instanz daraus gelesen werden müssen?

Gruß,
Tim

04.12.2006 - 15:44 Uhr

Sorry, die Antwort war wirklich unpräzise...

Ich bekomme mit IntelliSense die Eigenschaften von Benutzer nicht angezeigt wenn ich versuche darauf zuzugreifen.

04.12.2006 - 15:12 Uhr

Hallo Noodles,

das habe ich gedacht gehabt, aber irgendwie funktioniert das bei mir nicht.


    public class Foo
    {
        private static Benutzer benutzerInstanz;
        public static Benutzer BenutzerInstanz
        {
            get { return benutzerInstanz; }
        }
    }  

    public static class Benutzer
    {
        public static string Vorname
        {
            get { return "Vorname"; }
        }
        public static string Nachname
        {
            get { return "Nachname"; }
        }
    }

04.12.2006 - 14:19 Uhr

Hallo,

ich weiß leider nicht genau wo ich nach der Lösung nach meinem Problem suchen soll, darum auch der komische Titel.

Ich möchte eine statische Klasse erstellen die mehrere Methoden und Eigenschaften beinhaltet, und außerdem soll diese Klasse eine Eigenschaft? haben, die mehrere "Untereigenschaften" hat.

Der Zugriff soll ungefähr so aussehen.

Klasse.AktuellesDatum()
Klasse.Anmeldedatum
Klasse.Benutzer.Vorname
Klasse.Benutzer.Nachname

Ich hoffe das Problem ist einigermaßen verständlich...
Vielen Dank.

Gruß,
Tim

08.09.2006 - 15:08 Uhr

Hallo,

ich möchte auf meiner Webseite ein Login Control einbinden, welches je nach Loginstatus entweder das Form zur Abfrage der Benutzerdaten oder wenn der User eingeloggt ist ein paar Userdaten anzeigt.

Wie würdet Ihr das realisieren?
(Ich möchte nicht das fertige Control von .net benutzen)

Würdet Ihr zwei WebUserControls erstellen und je nach Loginstatus das entsprechende anzeigen, oder gibt es noch einen anderen Weg?

Gruß,
timt

28.05.2006 - 19:53 Uhr

Hallo herbivore,

Dein zweiter Gedanke war die Lösung meines Problems, vielen Dank.

Tim

28.05.2006 - 19:28 Uhr

Ich habe im Augenblick ein Brett vor dem Kopf...


string auftragID = listView1.FocusedItem.Text;
AuftragDetailForm auftragID = new AuftragDetailForm();

Eigentlich ist es klar, das das mit einem Fehler enden muss, er soll ja den Wert von auftragID als Namen nehmen und nicht den Typ von auftragID ändern, nur wie sag ich ihm das!?

Tim

28.05.2006 - 19:06 Uhr

Hallo herbivore,

das mit dem merken mache ich schon genauso wie Du gesagt hast, über ein Dictionary, allerdings sagt er mir bei erzeugen der Instanz das schon eine lokale Variable mit dem Namen existiert, wenn ich zum Beispiel die auftragID aus dem ListView als Instanznamen nutzen möchte, was ja auch eigentlich logisch ist. Nur weiß ich im Augenlick nicht wie ich es anders machen kann!?

AuftragDetailForm auftragID = new AuftragDetailForm();

Tim

28.05.2006 - 18:43 Uhr

Hallo,

ich habe ein Hauptform, auf dem ich ein ListView habe, in diesem wird eine Auftragsliste angezeigt, und über klicken auf einen Auftrag öffne ich den Auftrag.

Ich möchte mehrere Aufträge gleichzeitig öffnen können, möchte aber verhindern das der gleiche Auftrag mehrmals geöffnet wird.

Ich denke ich müsste unterschiedliche Instanzen der AuftragDetailsForm erstellen, aber wie mache ich das Programmgesteuert?

Vielen Dank,
Tim

17.05.2006 - 21:10 Uhr

Oh, ich sehe gerade das ich ja auch direkt über Default auf die Klasse zugreifen kann.

Dann habe ich aber noch eine Frage an Dich...
In Deinen Beitrag "Das neue Konfigurationsmodell im .NET Framework 2.0" erstellst Du eine Instanz (mySettings), wieso machst Du das dort nicht über Default?

Gruß,
Tim

17.05.2006 - 20:46 Uhr

Hallo Zusammen,

ich lese schon einige Zeit mit und nun habe ich ein Problem für welches ich keine Lösung über die Suche gefunden habe, bzw. funktionieren die gezeigten Lösungen bei mir nicht.

Ich habe zwei Formulare, im Hauptformular erstelle ich eine Instanz der Settings Klasse, die ich über den Konstruktor an ein zweites Formular übergeben möchte.

Ich bekomme aber immer folgenden Fehler:
"Fehler 1 Inkonsistenter Zugriff: Parametertyp "WindowsApplication2.Properties.Settings" ist weniger zugreifbar als Methode "WindowsApplication2.Form2.Form2 WindowsApplication2.Properties.Settings)"
E:\Visual Studio 2005\Projects\WindowsApplication2\WindowsApplication2\Form2.cs 15 16 WindowsApplication2"

Mein Code sieht folgendermaßen aus:
Form 1


namespace WindowsApplication2
{
public partial class Form1 : Form
{
private WindowsApplication2.Properties.Settings settings;

public Form1()
{
InitializeComponent();
settings = new WindowsApplication2.Properties.Settings();
}

private void button1_Click(object sender, EventArgs e)
{
Form2 frm2 = new Form2(settings);
frm2.Owner = this;
frm2.Show();
}

}
}

Form 2


namespace WindowsApplication2
{
public partial class Form2 : Form
{
private WindowsApplication2.Properties.Settings settings;

public Form2(WindowsApplication2.Properties.Settings _settings)
{
InitializeComponent();
settings = _settings;
}
}
}

Vielen Dank,
Tim