Laden...

Forenbeiträge von tequila slammer Ingesamt 253 Beiträge

06.08.2009 - 22:48 Uhr

Grundsätzlich geht es bei anderen Windows Installer benutzenden Installern nicht anders. Das stimmt.

Welcher Server kommt zum Einsatz -2008?
Ich kenne die Problematik unter Vista. Software die im Programmverzeichnis installiert wurde konnte nicht in ihre Einstellungsdatei schreiben. Man musste Sie dann als Administrator ausführen. Ursache ist, dass das Programmverzeichnis ab Vista auch zu den Systemverzeichnissen gehört. Du hast zwar geschrieben, das die Systeme nicht großartig verglichen werden können aber das Betriebsystem sollte man schon vergleichen können.

06.08.2009 - 16:17 Uhr

Diesen Beitrag muss ich in der Suche übersehen haben. Oder er passte nicht auf mein Suchraster. Klingt aber interessant und werde ich mal testen.

Die GetNodeAt Variante werde ich auch noch mal testen. Und dann mal abwägen.

Edit:

Zum Abschluß möchte ich meine Lösung kurz zeigen. Ich habe mich dann doch für die GetNodeAt Methode entschieden.


void tvBuildingProperties_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Right)
            {
                tvBuildingProperties.SelectedNode = tvBuildingProperties.GetNodeAt(e.Location);
            }
        }

void tvBuildingProperties_AfterSelect(object sender, TreeViewEventArgs e)
        {
            if (e.Node.Tag != null)
            {
                e.Node.ContextMenuStrip.Enabled = true;
            }
        }

Danke für eure Hilfe.

06.08.2009 - 16:12 Uhr

Hallo trib,

das Setup unter VS ist etwas eingeschränkt. Wenn du dich mit xml auskennst ist vielleicht WiX (Windows Installer XML) etwas für dich. Dies gibt es sogar mit VS Integration.

Ich habe die Erfahrung gemacht, dort viele Setup-Bedingungen schnell und einfach lösen zu können. Mit WiX wurde auch das Office 2007 Setup erstellt. Nur um mal die vielseitigen Möglichkeiten hervorzuheben.

Mfg Sebastian

06.08.2009 - 12:25 Uhr

Ich benötige den Index um das zugrundeliegende Objekt auch aus der Datenbank löschen zu können.

Ich habe mein Code nun etwas anpassen können. So klappt es auch allerdings muss nun immer erst mit der Maus auf das Node geklickt werden bevor ich das Kontextmenü nutzen kann,


tvBuildingProperties.Nodes [tvBuildingProperties.SelectedNode.Parent.Parent.Index].Nodes [tvBuildingProperties.SelectedNode.Parent.Index].Nodes.RemoveAt (tvBuildingProperties.SelectedNode.Index);

Schön wäre jedoch, das man gleich mit der rechten Maustaste das Kontektmenü nutzen kann. Tut man das wird das Node auch selektiert man bekommt aber das RootNode als selektiert zurück.

06.08.2009 - 11:32 Uhr

Hallo Forum,

ich habe mal wieder ein Problem. In meiner Form wird ein TreeView dynamisch erzeugt das so aussehen kann:

Root
|
Node1
| |
| SubNode1
| | |
| | SubSubNode1
| | SubSubNode2
| SubNode2
|
Node2

Auf SubSubNode1 und SubSubNode2 liegt ein ContextMenueStrip zum Löschen des SubSubNodes. Der Code sieht bisher so aus:


private void löschenToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (DialogResult.Yes == MessageBox.Show(this, "Möchten Sie das Element wirklich löschen?", "", MessageBoxButtons.YesNo, MessageBoxIcon.Question))
            {
                if (this.service.DeleteElement(this.building.Elements[tvBuildingProperties.SelectedNode.Index]) == true)
                {
                    tvBuildingProperties.Nodes[0].Nodes.RemoveAt(tvBuildingProperties.SelectedNode.Index);
                }
                else
                {
                    MessageBox.Show(this, "Fehler beim Löschen", "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }

Mein Problem ist, das SelectedNode.Index mir zwar den richtigen Index unterhalb von SubNode1 zurückgibt ich habe dann das falsche aus dem TreeView Löschen würde.

Nun gibt es ja die Methoden HitTest und GetNodeAt aber dort bekam ich jedesmal null zurück beim Versuch mit Mauskoordinaten zu arbeiten.

Ich denke ich sehe vor lauter Suchen die Lösung nicht. Denn eigentlich ist es ja ein banales Problem.

05.08.2009 - 15:10 Uhr

alles klar - das macht Sinn.

04.08.2009 - 09:31 Uhr

Danke Schamese,

die Komponente sieht gut aus. Allerdings sollte man das BackgroundImage über eine Property zuweisen können. Oder kann man das und ich habs nicht gesehen?

31.07.2009 - 23:30 Uhr

Hallo Forum,

ich bin gerade dabei eine eine kleine Warteanimation in mein Programm einzubauen. Das Prinzip ist ähnlich dem eines SplashScreens nur das es halt auch genutzt wird, wenn die Hauptform schon geladen ist.

So weit funktioniert es auch schon nur wird das Backgroundimage nicht angezeigt, was dazu führt das nur der Ladebalken frei auf dem Desktop lädt. Das Background Image wird im Designer angelegt mit:


this.BackgroundImage = global::AdministrationClient.Properties.Resources.StartSplash;

Anbei mal etwas Code:


        private void createMemberToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Splash splFrm = new Splash();
            splFrm.MaxValue = 100000;
            splFrm.MinValue = 0;
            splFrm.Show(this);

            MemberForm frmMember = new MemberForm();
            frmMember.MdiParent = this;

            //Zeitverzögerung für Tests
            for (int i = 4; i < 100000; i++)
            {
                splFrm.setStatusValue(i);
            }

            splFrm.Close();
            frmMember.Show();
        }

Der "Splash"


    public partial class Splash : Form
    {
        public delegate void statusDelegate(int status);

        public Splash()
        {
            InitializeComponent();
        }

        public void setStatusValue(int Status)
        {
            this.Invoke(new statusDelegate(test), Status);
        }

        public void test(int value)
        {
            progressBar1.Value = value;
        }

        public int MinValue
        {
            set
            {
                progressBar1.Minimum = value;
            }
        }

        public int MaxValue
        {
            set
            {
                progressBar1.Maximum = value;
            }
        }
    }

31.07.2009 - 09:43 Uhr

Hallo Forum,

ich habe nun herausgefunden, das es an meiner Signierung liegt. Allerdings möchte ich mein Klassenbibliothek nur ungern unsigniert auf einem Server liegen haben. Hat einer ähnliche Erfahrungen gemacht und kann mir weiterhelfen?

mfg Sebastian

30.07.2009 - 10:23 Uhr

Hallo Forum,

Mein WebService hat zwei Methoden:
bool Login(string username, string password)
orders GetOrders()

Das ganze läßt sich auch prima über die URL aufrufen und auch in einer Beispiel-Clientanwendung konsumieren.

Versucht der Client sich nun aber mit "Login" anzumelden bekomme ich immer die Meldung:

System.ServiceModul.FaultException

"Die Anforderung konnte vom Server nicht verarbeitet werden. ---> Die Assembly lässt keine Aufrufer zu, die nicht voll vertrauenswürdig sind."

Ich weiß nun nicht mehr wo ich noch ansetzen kann.

23.06.2009 - 18:09 Uhr

Hallo,

@dN!3L: Die Wsdl.exe kenne bisher nur vom Konsumieren fremder WebServices. Das darauf nicht gekommen bin. ?(

@Xynratron: Ich schreibe sowohl Client als auch Service selbst. Aber dann brauche ich doch nicht vererben, wenn ich im Client die generierten Klassen entferne und durch ein using ersetze. Und eigentlich falle ich doch dann wieder dahin zurück, das beim Aktualisieren des Service alles noch mal angepasst werden muss, oder?

22.06.2009 - 22:49 Uhr

Hallo an alle.

@Rainbird: Die Anwendung kommuniziert übers Internet. Remoting wäre schön gewesen. 😉

@dN!3L: Wie kann ich denn die Proxies selbst generieren? Hast du dazu vielleicht ein paar Links oder ein kleine Anleitung?

Danke für die bisherigen Antworten.

20.06.2009 - 12:48 Uhr

Was dann bedeutet, dass ich beim Aktuallisieren des WebService im Projekt auch die Proxy-Klasse wieder anpassen muss, oder?

18.06.2009 - 21:36 Uhr

Hallo Forum,

ich erstelle gerade ein WebService, dieser stellt eine öffentliche Methode bereit mit einem Parameter. Dieses Parameterobjekt stammt aus einer Bibliothek, die sowohl im WebService als auch im WinForm Projekt referenziert ist. Rufe ich nun in meiner WinForm die WebService Methode auf, ist der Parametertyp auf einmal anders. Was mache ich an dieser Stelle falsch?

Beispiel:

WebService


public void CreateAccount(myLib.User)
...

WinForm


public void CreateAccount(WinForm.Test.WebService.User)
...

11.05.2009 - 11:00 Uhr

vbprogger, ich danke dir. Damit klappt es nun.

09.05.2009 - 22:06 Uhr

Danke talla,

genau das war das Problem.

SeeQuark, danke auch dir allerdings denke ich ist das doch etwas zu viel Aufwand um nur zwischen zwei Fenster zu wählen. Insgesamt aber ein sehr interessanter Artikel, der den Weg zu meinen Favoriten gefunden hat.

09.05.2009 - 14:42 Uhr

Hallo Forum,

ich bin absoluter Neuling im Bereich WPF und taste mich langsam ran.

Im Moment spiele ich mit der App.xaml und versuche dort je nach übergebenen Parameter window1 oder window2 anzeigen zu lassen. Mit WinForms war das recht einfach in der program.cs zu erledigen aber unter WPF will es einfach nicht.

In der App.xaml habe ich das StartUp-Event registriert.

Mein Code bisher:


        private void Application_Startup(object sender, StartupEventArgs e)
        {
            string[] args = e.Args;

            if (args.Length > 0)
            {
                if (args[0].ToLower() == "window1")
                {
                    Window1 window1 = new Window1();
                    window1.Show();
                    Application.Current.MainWindow = window1;
                }
                else if (args[0].ToLower() == "window2")
                {
                    Window2 window2 =new Window2();
                    window2.Show();
                    Application.Current.MainWindow = window2;
                }
            }
            else
            {
                Window1 window1 = new Window1();
                window1.Show();
                Application.Current.MainWindow = window1;                
            }
        }

Leider macht er mir immer das Window1 mit auf, wenn er Window2 öffnen soll. Nun gibt es ja die WindowCollection, diese hat aber keine Remove oder Add Methoden.

09.05.2009 - 11:45 Uhr

Aber auf der Maschine ist keine Firewall an. Auf meinem lokalen System ist eine an und es geht. Ich werde es ausprobieren.

Ja das Klassengerüst ist nicht von mir, sondern wurde von mir nur auf .net 2.0 umgestellt und ich habe noch weiter FTP-Befehle implementiert. Aber das hatte ich auch geschrieben.

08.05.2009 - 13:17 Uhr

Hallo Forum,

meine Problemstellung verlangt in einem regelmäßigem Zeitintervall Daten per FTP abzuholen und diese in einem weiteren Step abzuarbeiten.

Ich habe das ganze als Dienst mit einer in teilen selbstgeschriebenen FTP-Klasse gelöst. Diese Klasse nutzt den "RETR" Befehlt um Daten herunterzuladen.

Ursprünglich wurde das Programm auf Windows XP Maschinen betrieben und funktioniert dort auch nachwievor. Nun soll das Programm auf Windows Server 2003 betrieben werden, was leider bisher zu nicht nachvollziehbaren Problemen beim herunterladen führt.

Der Dienst meldet, das er den angegebenen Host nicht finden kann, obwohl zuvor ein Login erfolgreich durchgeführt worden ist. Meine Vermutung ist, das die Datenverbindung möglichweise in diesem Fall nicht funktioniert.

Nachfolgend noch etwas Code aus dem Service und der FTP Klasse:

Service Timer_Elapsed-Methode:


myFTP.FTPClient ftp = new myFTP.FTPClient();
ftp.RemoteHost = this.ftpHost;
ftp.RemoteUser = this.ftpUser;
ftp.RemotePassword = this.ftpPassword;
ftp.Login();
ftp.SetBinaryMode(false);
ftp.Download("TestDaten.txt", myFTP.FTPClient.DownloadCommand.GET);
ftp.Close();
...

FTP-Download-Methode (von mir auf .net 2.0 angepasst)


public void Download(string RemoteFileName, DownloadCommand CommandType)
        {
            if(!logined)
            {
                Login();
            }

            if (LocalFileName.Equals(""))
            {
                LocalFileName = RemoteFileName;
            }

            if(!System.IO.File.Exists(LocalFileName))
            {
                System.IO.Stream st = System.IO.File.Create(LocalFileName);
                st.Close();
            }

            System.IO.FileStream output = new System.IO.FileStream(LocalFileName, System.IO.FileMode.Open);
            System.Net.Sockets.Socket cSocket = createDataSocket();

            long offset = 0;

            if(resume)
            {
                offset = output.Length;
                
                if(offset > 0)
                {
                    sendCommand("REST " + offset);
                    
                    if(this.returnValue != 350)
                    {
                        offset = 0;
                    }
                }

                if(offset > 0)
                {
                    long npos = output.Seek(offset, System.IO.SeekOrigin.Begin);
                }
            }

            //sendCommand("GET " + RemoteFileName);
            //sendCommand("RETR " + RemoteFileName);

            sendCommand(Enum.GetName(typeof(DownloadCommand), CommandType) + " " + RemoteFileName);

            if(!(this.returnValue == 150 || this.returnValue == 125))
            {
                throw new System.IO.IOException(this.reply.Substring(4));
            }

            while(true)
            {
                this.bytes = cSocket.Receive(this.buffer, this.buffer.Length, 0);
                output.Write(this.buffer,0,this.bytes);

                if(bytes <= 0)
                {
                    break;
                }
            }

            output.Close();
       
            if (cSocket.Connected)
            {
                cSocket.Close();
            }

            readReply();

            if( !(this.returnValue == 226 || this.returnValue == 250) )
            {
                throw new System.IO.IOException(this.reply.Substring(4));
            }
        }

Datenkanal (von mir auf .net 2.0 angepasst)


private System.Net.Sockets.Socket createDataSocket()
        {
            sendCommand("PASV");

            if(this.returnValue != 227)
            {
                throw new System.IO.IOException(this.reply.Substring(4));
            }

            int index1 = this.reply.IndexOf('(');
            int index2 = this.reply.IndexOf(')');

            string ipData = this.reply.Substring(index1 + 1, index2 - index1 - 1);
            int[] parts = new int[6];

            int len = ipData.Length;
            int partCount = 0;
            string buf="";

            for (int i = 0; i < len && partCount <= 6; i++)
            {
                char ch = Char.Parse(ipData.Substring(i,1));

                if (Char.IsDigit(ch))
                {
                    buf+=ch;
                }
                else if (ch != ',')
                {
                    throw new System.IO.IOException("Malformed PASV reply: " + this.reply);
                }

                if (ch == ',' || i+1 == len)
                {

                    try
                    {
                        parts[partCount++] = Int32.Parse(buf);
                        buf="";
                    }
                    catch (Exception)
                    {
                        throw new System.IO.IOException("Malformed PASV reply: " + this.reply);
                    }
                }
            }

            string ipAddress = parts[0] + "."+ parts[1]+ "." + parts[2] + "." + parts[3];

            int port = (parts[4] << 8) + parts[5];

            System.Net.Sockets.Socket s = new System.Net.Sockets.Socket(System.Net.Sockets.AddressFamily.InterNetwork, System.Net.Sockets.SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp);
            System.Net.IPEndPoint ipEndPoint = new System.Net.IPEndPoint(System.Net.Dns.GetHostEntry(ipAddress).AddressList[0], port);

            try
            {
                s.Connect(ipEndPoint);
            }
            catch(Exception)
            {
                throw new System.IO.IOException("Can't connect to remote server");
            }

            return s;
        }

Eine Firewall oder gesperrte Ports scheiden aus. Als Basis für meine FTP-Klasse diente dieser Code: http://www.csharphelp.com/archives/archive9.html

11.04.2009 - 10:35 Uhr

Danke vbprogger,

allerdings handelt es sich bei meiner Anwendung um eine Klassenbibliothek. Da ist ein registry-Zugriff im späteren Einsatz sicher ungewünscht. Trotzdem danke.

10.04.2009 - 18:21 Uhr

Danke euch beiden. Ihr habt mir sehr weitergeholfen. Frohe Ostern.

10.04.2009 - 14:19 Uhr

Hallo Forum,

ist es möglich mit dem Framework den Ländercode des Betriebsystems abzufragen?

Also bei einer deutschen Installation DE und bei einer englischen US usw. zu erhalten.

mfg Sebastian

21.03.2009 - 10:02 Uhr

Hallo kleines_eichhoernchen,

vielen Dank für den Hinweis. Ich denke da werde ich mich schnellstmöglich Einlesen.

Inzwischen habe ich auch den Fehler für die fehlerhafte Ausgabe gefunden. Es war ein fehlendes writeEndElement();

@mirkom76: entschuldige, Ich wurde über deinen Beitrag nicht informiert. Somit habe ich ihn nicht bemerkt.

18.03.2009 - 20:50 Uhr

verwendetes Datenbanksystem: <xml>

Hallo Leute,

ich habe zwei Klassen:

Klasse A stellt eine Methode getNode, der eine xmlTextWriter Instanz übergeben wird. Diese Methode macht nichts anders als ein spezielles Node zu schreiben.

Klasse ACollection ist eine Klasse, die IList, ICollection und IEnumerable erbt und Member vom Typ Klasse A aufnimmt. Zusetzlich hat sie die Methode GetNodes, der eine xmlTextWriter Instanz übergeben wird.

Die Methode ist so aufgebaut


public void GetNodes(XmlTextWriter writer)
{
   foreach(ClassA classObject in classACollection)
   {
      classObject.getNode(writer);
   }
}

Aussehen sollte das Ganze dann so:


<NodeA>
  ...
</NodeA>
<NodeA>
  ...
</NodeA>

Aussehen tuts aber so:


<NodeA>
  ...
  <NodeA>
    ...
  </NodeA>
</NodeA>

Hat jemand eine Idee was ich falsch mache? Ich finde meine Logik ok, aber sie ist es ja offensichtlich nicht.

21.01.2009 - 16:48 Uhr

Ah, ok. Ist also was, was ich für später auf jedenfall benötigen werden, wenn das Mini-Framework wächst.

21.01.2009 - 16:32 Uhr

Sieht auf dem ersten Blick umständlich aus. Dafür brauche ich ein wenig Freizeit am Wochende. Wo ist der Vorteil, wenn es auf ein ähnliches Ergebnis hinausläuft?

21.01.2009 - 14:46 Uhr

Hallo Bernd,

der Datenbankname fehlt natürlich nur im Pseudocode 😉
Dein Tipp ist im Moment die Lösung für mich. Danke dir.

Vielleicht hat der ein oder andere aber auch noch andere Lösungsansätze, dann immer her damit.

21.01.2009 - 11:35 Uhr

Hallo Forum,

ich bin gerade zu Lernzwecken dabei ein kleines "Shopping"-Framework zu entwickeln. Alle meine Klassen mit Properties, Methoden und Felder sind designed.

Da ich für die Nutzung die Datenbankstrukur und -system festgelegt habe, habe ich in meinen Klassen auch Methoden wie etwa SaveProduct vorgesehen. Weiterhin habe ich in meinem Framework, die Konfiguration der allgemeinen Datenbankverbindung vorgesehen, in der etwa der Server und der Datenbankbenutzer und Kennwort angegeben wird.

Mein Problem besteht nun darin, dass ich im Moment immer eine Property für die Datenbankverbindung in meinen Klassen haben muss. Ich mir aber vorstelle, einfach einmal eine Instanz der Datenbankkonfiguration erstelle und diese dann automatisch - quasi im Verborgenen- an meine Klassen weitergebe.

PseudoCode wie es bisher ist:


Test.Shopping.Configuration.DataBase dbconfig = new Test.Shopping.Configuratio.DataBase(dbServer,dbUser,dbPassword);

Test.Shopping.MasterData.Product pr = new Test.Shopping.MasterData.Product();
pr.DataBaseSettings = dbconfig;
pr.Name = "Testproduct";
pr.SaveProduct();

PseudoCode wie es sein sollte:


Test.Shopping.Configuration.DataBase dbconfig = new Test.Shopping.Configuratio.DataBase(dbServer,dbUser,dbPassword);

Test.Shopping.MasterData.Product pr = new Test.Shopping.MasterData.Product();
pr.Name = "Testproduct";
pr.SaveProduct();

Könnt ihr mir hier Hilfestellung, Literaturhinweise oder Denkanstöße geben?
Ich bin mir bewußt, dass es sich eigentlich so gehört die Datenbindung zu trennen. Aber für ein privates Projekt denke ich geht es schon in Ordnung, es ist ja nur zum lernen da.

Mfg Sebastian

06.12.2008 - 11:55 Uhr

Hallo Leute,

ich bin auf der Suche nach einem Control oder Codesnippet, dass mir den Text eines Word 2007 Dokuments inklusive Formatierung usw. auslesen kann. Hat einer schon mal so ein Control benötigt oder gar erstellt?

Das Auslesen des Inhalts bekomme ich schon hin nur mit den Formatierungen komme ich im Moment nicht klar.

Ziel ist es, diesen Text später in einer Anwendung zum Lesen anzuzeigen.
Ich habe auch schon nach fertigen Controls gesucht und bin auf das TX Textcontrol gestossen. Es ist nur leider etwas zu teuer für meine kleine Anwendung.

Mfg Tequila

25.11.2008 - 16:34 Uhr

Hallo herbivore,

mir ging es nicht um die Fehlermeldung fehlt eine Using Direktive. Was ich gesucht habe war System.ComponentModel. Das hatte ich auf dem MSDN Artikel einfach übersehen.

Es war wohl einfach schon zu spät.

Danke trotzdem.

24.11.2008 - 23:48 Uhr

Hallo Forum,

ich arbeite gerade sehr viel mit dem PropertyGrid und frage mich die ganze Zeit, wie ich es anstellen muss um Kategorien in die Auflistung einzufügen. Zudem würde ich für meine Objekteigenschaften auch gerne Hilfetexte anbieten.

Laut google könnte man das so realisieren:


[Description("Beschreibung fuer Vorname")]
[RefreshProperties(RefreshProperties.Repaint)]
public string Name
{
...
}

Allerdings bekomme ich dann immer die Fehlermeldung: Fehlt eine Using Direktive.

Habt Ihr noch eine Idee für mich?

26.10.2008 - 10:36 Uhr

Hallo Jürgen,

die Erscheinungsjahre liegen zwischen 2003 & 2004, was ja .net 1.1 vermuten läßt. Amazon stellt leider kein Inhaltsverzeichnis zur Verfügung.

Wenn die Bücher für .net 1.1 geschrieben sind kennt vielleicht einer von Euch von gleicher Qualität zu den Themen für .net > 1.1?

Danke Sebastian

24.10.2008 - 19:30 Uhr

Hallo Forum,

Ich interessiere mich für zwei schon etwas ältere Bücher und würde gerne wissen ob es sich bei diesen um das Framework 1.1 oder schon um 2.0 handelt.

Die Bücher um die es geht:
.NET Softwareentwicklung - Analsysverfahren und Designprinzipien ISBN: 3-446-22019-4

XML Web Services ISBN: 3-446-22236-7

Vielleicht hat ja einer von euch die Bücher und könnte kurz nachsehen. Bei Amazon ist es nicht ersichtlich bzw. sind die Bücher nicht mehr lieferbar.

Danke.

30.09.2008 - 16:57 Uhr

Danke Jürgen,

eigentlich hatte ich verstanden was da passiert. Dachte ich zu mindest. Aber nun ist es klar. Danke dir noch einmal.

30.09.2008 - 13:26 Uhr

Hallo,

@serial: das Problem ist, dass nach dem Verarbeiten der Daten das Fenster automatisch geschlossen werden soll.

@Jürgen Gutsch: Danke für den mir schon bekannten Link. Ich habe darauf hin das Beispiel mal versucht auf mein Problem umzumünzen. Dazu habe ich die Zeilen entsprechend angepasst:


String csname2 = "WindowsCloseScript";
Type cstype = this.GetType();
ClientScriptManager cs = this.Page.ClientScript;

if (!cs.IsClientScriptBlockRegistered(cstype, csname2))
{
      System.Text.StringBuilder cstext2 = new System.Text.StringBuilder();
      cstext2.Append("<script type=\"text/javascript\"> function DoClick() {");
      cstext2.Append("parent.Shadowbox.close(); } </");
      cstext2.Append("script>");
      cs.RegisterClientScriptBlock(cstype, csname2, cstext2.ToString(), false);
}

Mein LinkButton bevor ich meine Frage stelle:


this.btAccept = new LinkButton();
this.btAccept.ID = "btAccept";
this.btAccept.Text = "Auswahl übernehmen";
this.btAccept.Click += new EventHandler(btAccept_Click);
//this.btAccept.OnClientClick = "parent.Shadowbox.close()";

Ich verstehe im Moment noch nicht, wie mein onClick Event ausgeführt werden kann, wenn ich statt btAccept_Click die JavaScript Funktion aufrufe. So steht es ja im Beispiel, wo der Button auch nicht mit runat=Server beschrieben ist.

Irgendwie stehe ich gerade auf dem Schlauch. ?(

29.09.2008 - 19:25 Uhr

Ich habe ein Formular, dass in einem separaten Fenster angezeigt wird. Durch drücken auf einen Linkbutton sollen die Daten in die Datenbank gespeichert werden und anschließend das Fenster geschlossen werden.

Ich habe da schon mal was von einem ClientScriptManager gesehen. Im Moment steige ich da aber noch nicht so durch - habe ihn mir aber auch noch nicht richtig angesehen. Oder kann man das JavaScript auch anders ausführen?

29.09.2008 - 14:36 Uhr

Hallo Forum,

ich habe ein Problem. In einem Formular gibt es LinkButton um die Daten des Formulars zu übernehmen. Dieser Button benutzt sowohl die onClientClick- als auch die onClick-Methode.

Wenn ich mich richtig belesen habe ist es nun so, dass erst die OnClientClick-Methode ausgeführt wird und dann erst die onClick-Methode. Wie kann ich die Reihenfolge vertauschen, damit erst meine Daten verarbeitet werden und dann das Fenster geschlossen wird?

mfg

01.08.2008 - 12:28 Uhr

Mahlzeit Peter,

du stehst aber früh auf. 8o.
Ich verwende doch auch nur ein Formular pro Seite. Ich habe dennoch in der Masterpage das runat="server" entfernt.

Das Firebug Add-On ist richtig klasse. Aber meinen Fehler bekomme ich einfach nicht weg, weil mir der Ansatz bzw. die Ursache für das Problem nicht klar ist.
Fehlt das __doPostBack nun in der prototype.js oder einfach in meiner Default2.aspx Seite?

01.08.2008 - 11:54 Uhr

Hallo hobofan,

meiner Meinung nach hat kleines_eichhoernchen bedingt recht. Es gibt fertige nutzbare Engines. Aber der Lernprozess ist dort nicht so hoch wie durch die Einarbeitung in den Planungsprozess und die Herausforderung auftretende Problemestellungen zu lösen.

Lass dich nicht abbringen.

31.07.2008 - 12:33 Uhr

Hallo Peter,

Im Lightbox Beispiel habe ich meine Testanwendung mal zusammen gepackt.

Du brauchst nun nur noch die Default3.aspx aufrufen. Diese enthält zwei Links auf die Default2.aspx - einmal als Lightbox Aufruf und einmal als normalen Link.

Mfg Sebastian

29.07.2008 - 08:17 Uhr

Hallo Peter,

der Breakpoint wird nicht erreicht.
Ein Minianwendung ist schnell gebaut man braucht nur zwei Seiten. Ich kann gerade kein Code posten, da ich hier kein VS habe - deshalb poste ich die Vorgehensweise ich hoffe das ist ausnahmsweise ok.

Seite 1: Default.apsx:
Hier muss im Headbereich rein:

<link rel="stylesheet" href="css/lightbox.css" type="text/css" />
<script src="scripts/prototype.js" type="text/javascript"></script>
<script src="scripts/lightbox.js" type="text/javascript"></script>

Im Body kann dann über den speziellen Link <a href="Default2.aspx" class="lbOn"> zeigt die Lightbox an</a> die Seite in die Lightbox geladen werden.

Seite 2: Default2.aspx:
Hier reicht es am besten zwei Checkboxen zu setzen und diese dann mit einem Button im Click Event prüfen zu lassen, welcher gechecked wurde.
Weiterhin brauchst du noch den Link zum Schliessen der Seite einzubinden:

<a href="#" class="lbAction" rel="deactivate">Close Lightbox.</a>

27.07.2008 - 22:15 Uhr

Hallo Peter,

nachfolgend mal die Version in dem ich es mit einem extra Button zum Übernehmen der Auswahl versucht habe.

Mein Button:


<body>
    <form id="form1" runat="server">
    <div>
        <br />
        Der Artikel wurde Ihrem Warenkorb hinzugefügt.<br />
        <asp:PlaceHolder ID="PlaceHolderIngrediends" runat="server"></asp:PlaceHolder>
        <br />
        <asp:LinkButton ID="lbtTest" runat="server" OnClick="lbtTest_Click">Test</asp:LinkButton><p>
            <a href="#" class="lbAction" rel="deactivate">Close</a>
        </p>
    </div>
    </form>
</body>

Das Page_Load


protected void Page_Load(object sender, EventArgs e)
    {
        if (Request.QueryString.Count != 0)
        {
            this.PlaceHolderIngrediends.Controls.Clear();
            this.lbtTest.Visible = false;

            string[] commandArguments = Request.QueryString["id"].Split(new char[] { '|' });
            int articleID = int.Parse(commandArguments[0]);
            int articleSizeID = int.Parse(commandArguments[1]);

            Guid guid = (Guid)Session["basket"];

            //einige SQL Operationen

            System.Data.SqlClient.SqlDataReader reader = query.ExecuteReader();
            this.ingredientItemsList = new System.Collections.Generic.List<CheckBox>();
            
            int ingredientCount = 0;

            while (reader.Read())
            {
                CheckBox ingredient = new CheckBox();
                ingredient.Text = reader["articleName"].ToString();
                ingredient.ID = reader["ArticleIngredientID"].ToString();
                
                this.ingredientItemsList.Add(ingredient);
                this.PlaceHolderIngrediends.Controls.Add(ingredient);
                ingredientCount++;
            }

            reader.Close();
            query.Dispose();
            connection.Close();

            if (ingredientCount != 0)
            {
                Label test = new Label();
                test.Text="Sie können den Artikel um weitere Zutaten ergänzen:<br />";
                this.PlaceHolderIngrediends.Controls.AddAt(0, test);
                this.lbtTest.Visible = true;
            }
        }
        else
        {
            Response.Redirect("Default.aspx", true);
        }
    }

Und das Button_Click Event


protected void lbtTest_Click(object sender, EventArgs e)
    {
        if (this.ingredientItemsList[0].Checked == true)
        {
            int articleID = int.Parse(this.ingredientItemsList[0].ID.ToString());
            Guid guid = (Guid)Session["basket"];

            System.Data.SqlClient.SqlConnection connection = new System.Data.SqlClient.SqlConnection(ConfigurationManager.AppSettings["SQLConnectionString"]);
            System.Data.SqlClient.SqlCommand query = new System.Data.SqlClient.SqlCommand("INSERT INTO baskets(basketGuid, articleGuid,articleID,quantity) VALUES(@basketGuid, @articleGuid,@articleID,@quantity)", connection);
            query.Parameters.AddWithValue("@basketGuid", (Guid)Session["basket"]);
            query.Parameters.AddWithValue("@articleGuid", System.Guid.NewGuid());
            query.Parameters.AddWithValue("@articleID", articleID);
            query.Parameters.AddWithValue("@quantity", 1);

            connection.Open();
            query.ExecuteNonQuery();
            connection.Close();
            query.Dispose();
        }
    }

Im Event habe ich die SQL Sachen mal dringelassen auch wenn ich nicht glaube das hier ein Fehler liegt. Wie gesagt wenn es nicht im Lightbox läuft geht alles soweit prima.

26.07.2008 - 17:47 Uhr

Also angebrummt hat dich keiner.

Was du brauchst ist eine Methode, der du einen Pfad mitgibst und die sich beim vorhandensein von weiteren Ordnern selbst erneut aufruft.
Vereinfacht und ohne sprachspezifisch zu sein etwa so:


pruefeAufVerzeichnisse( Startverzeichnis)
{
    Hat Startverzeichnis Unterverzeichnisse?
    ja: pruefeAufVerzeichnisse( Unterverzeichnis)
    nein: pruefeAufDatei(...)
}

26.07.2008 - 17:13 Uhr

Hallo Leute,

ich experimentiere gerade sehr viel mit dem JavaScript 'Lightbox gone Wild'.
Viele kenne es vielleicht von Bildergalerien, nur das man mit dieser Variante HTML-Dokumente anzeigen lassen kann.

Meine Beispielanwendung ist ein kleiner Webshop in dem man Artikel nach dem man sie in den Warenkorb gelegt hat noch via Checkboxen konfiguriere bzw. ergänzen kann.

Dazu nutze ich dann die Lightbox. Nun habe ich das Problem, dass ich mit dem speziellen Lightbox-Link zum Schließen der Lightbox nicht mehr meine Checkboxen prüfen kann um die Änderungen mit in den Warenkorb zu legen.

Also versuche ich das Problem zu lösen in dem ich ein LinkButton Control zur Übernahme der Auswahl heranziehe, in dem ich ein ClickEvent anfüge.

Wird die Seite in der Lightbox angezeigt, wird das Event nicht gefeuert. Rufe ich die Seite direkt im Browser auf klappt alles prima.

Lightbox Gone Wild gibts hier: http://particletree.com/features/lightbox-gone-wild/

Hat von Euch jemand Erfahrung mit der Lightbox? Auf Wunsch kann ich auch etwas Code posten.

26.07.2008 - 13:42 Uhr

Hallo felifell,

was du brauchst nennt sich Rekursion.
Das heißt du gehst jeden Ordner rekursiv durch und schaust nach ob weitere Ordner enthalten sind oder ob deine Dateien enthalten sind.

Die History-Ordner kannst du ja ausgrenzen.
Wenn das dann läuft, kannst du dich um das Verarbeiten der Dateien kümmern, was dann wohl der leichtere Part sein dürfte.

herbivore war schneller.

17.07.2008 - 18:15 Uhr

Hallo Peter,

ich habe mich gerade in der MSDN über den ClientScriptManager informiert.
Nun habe ich nur noch das Problem, dass ich von JavaScript überhaupt keine Ahnung habe. Kannst du mir da helfen?

15.07.2008 - 09:44 Uhr

Guten Morgen,

ja genau das möchte ich.

14.07.2008 - 20:06 Uhr

Hallo Peter,

meine Frage:
Wie bekomme ich asp.net dazu bei erfolgreicher Prüfung für weitere Konfigurationsmöglichkeiten den Link zu aktivieren - sprich ihn automatisch anzuklicken, so das es der Benutzer nicht mehr tun muss?

14.07.2008 - 17:09 Uhr

Hallo Forum,

ich baue gerade ein kleines Warenkorbsystem, das ein Lightbox-JavaScript benutzt um weitere Informationen oder Auswahlmöglichkeiten getrennt anzeigen zu können.

Damit das funktioniert muss eigentlich ein Link nach folgendem Aufbau
<a href="seite2.htm" class="lbOn">Text</a> angeklickt werden. Nun möchte ich das gern so haben, wenn ein Artikel in den Warenkorb landet und dieser zum Beispiel konfigurierbar ist, dass dann dieser Link automatisch ausgeführt wird.

Ich hoffe ihr versteht wie ich es meine, da ich es im Moment nicht besser erklären kann.

01.06.2008 - 15:57 Uhr

Hallo Peter,

ich habe ein ähnliches Problem wie xforfun. Auch ich erstelle eine Tabelle mit dynamischen LinkButtons. Ich konnte mein Problem auch lösen, in dem ich ich die Methode zum erstellen in die OnInit Methode verschoben habe.

Mein Problem ist nun, dass die Veränderungen an der Tabelle (verursacht durch die Events) erst bei einer erneuten Seitenaktualisierung sichtbar sind. Das liegt sicherlich am OnInit. Bisher behelfe ich mir unsauber in dem ich das erzeugte Control vom OnInit im PreRender wieder entferne und neu hinzufüge. Gibt es hier einen besseren Weg?

Nachfolgend ein minimales Codebeispiel


protected override void OnInit(EventArgs e)
{
        if (Session["basket"] == null)
        {
            Guid basketGuid = System.Guid.NewGuid();
            Session["basket"] = basketGuid;
        }

        this.basket.Controls.Add(ShowBasket((Guid)Session["basket"]));
        base.OnInit(e);
}

protected override void OnPreRender(EventArgs e)
{
        this.basket.Controls.Clear();
        this.basket.Controls.Add(ShowBasket((Guid)Session["basket"]));

        base.OnPreRender(e);
}

public HtmlTable ShowBasket(Guid BasketGuid)
{
        //Tabelle mit LinkButtons wird erstellt
        HtmlTable table = new HtmlTable();
        table.ID = "basketItemTable";
        ...
        LinkButton button = new LinkButton();
        button.Command += new CommandEventHandler(RiseQantity_Command);
        button.Text = "+";
        button.CommandArgument = reader["articleguid"].ToString() + "|" + reader["quantity"].ToString();
         button.ID = "MengeErhoehen" + reader["articleID"].ToString();
                
         cell = new HtmlTableCell();
         cell.Controls.Add(button);
         row.Cells.Add(cell);

         table.Rows.Add(row);
         ...
}