Entwickler-Ecke

WinForms - IDictionary und listBoxen


asterix76 - Mo 09.03.09 16:19
Titel: IDictionary und listBoxen
Hallo, wie kann ich den Inhalt eines IDictionary in eine ListBox ausgeben?


C#-Quelltext
1:
2:
3:
4:
5:
IDictionary<IPEndPoint, Variable> agent = Manager.Discover(VersionCode.V2, new IPEndPoint(IPAddress.Broadcast, 161), new OctetString("public"), 100);
                foreach (KeyValuePair<IPEndPoint, Variable> pair in agent)
                {
                   listBox_items.Items.Add(pair.Key + " announces " + pair.Value.Data);
                }


Diese funktioniert nicht. Die Ausgabe auf die Konsole hingegen funzt:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
IDictionary<IPEndPoint, Variable> agent = Manager.Discover(VersionCode.V2, new IPEndPoint(IPAddress.Broadcast, 161), new OctetString("public"), 100);
            foreach (KeyValuePair<IPEndPoint, Variable> pair in agent)
            {
                Console.WriteLine(pair.Key + " announces " + pair.Value.Data);
            }

            Console.Write("Press any key to continue . . . ");
            Console.ReadKey(true);
        }



Warum ist das so?
THX füe Eure Antworten

Moderiert von user profile iconKha: C#-Tags hinzugefügt
Moderiert von user profile iconKha: Topic aus C# - Die Sprache verschoben am Mo 09.03.2009 um 16:42


Kha - Mo 09.03.09 17:47

user profile iconasterix76 hat folgendes geschrieben Zum zitierten Posting springen:
Diese funktioniert nicht.
Was sich wie bemerkbar macht...? Einen Syntaxfehler sehe ich jedenfalls nicht.


asterix76 - Mo 09.03.09 18:44

Hallo, ich habe folgendes Programm:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
/*
 * Created by SharpDevelop.
 * User: lextm
 * Date: 2008/8/9
 * Time: 12:24
 * 
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 */

using System;
using System.Collections.Generic;
using System.Net;
using Lextm.SharpSnmpLib;
namespace TestDiscovery
{
    class Program
    {
        public static void Main(string[] args)
        {
            IDictionary<IPEndPoint, Variable> agents = Manager.Discover(VersionCode.V2, new IPEndPoint(IPAddress.Broadcast, 161), new OctetString("public"), 100);
            foreach (KeyValuePair<IPEndPoint, Variable> pair in agents)
            {
                Console.WriteLine(pair.Key + " announces " + pair.Value.Data);
            }

            Console.Write("Press any key to continue . . . ");
            Console.ReadKey(true);
        }

       
    }
}


und will die Ausgabe eigentlich nur in einer WindowsForm haben.
Leider bekomme ich das nicht hin.
Liegt es vielleicht an der "Lextm.SharpSnmpLib" oder kann man so ein Kommandozeilen Toll nicht einfach in eine Windows Form überführen? Vielleicht hat der Autor seinen Quellcode auch so gesichert, dass man nichts verändern darf
Beachte die ersten Zeilen im Code. Das habe ich bis jetzt auch nicht rausbekommen, was der Autor mir damit sagen will.
Hat jemand ne Idee?

THX für die Antworten

Moderiert von user profile iconKha: C#-Tags hinzugefügt


jaenicke - Mo 09.03.09 19:09

Erstelle lieber eine neue WindowsForms Anwendung und füge dann den Code an die entsprechenden Stellen ein. In deinem Fall vermutlich am besten in einen ButtonClick.

Bei einer WindowsForms Anwendung musst du ereignisorientiert vorgehen, d.h. du musst auf z.B. einen ButtonClick reagieren. Du kannst dafür nicht einfach die main-Methode benutzen.


asterix76 - Mo 09.03.09 19:19

Hallo ich habe jetzt folgendes:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
using System;
using System.Collections.Generic;
using System.Net;
using Lextm.SharpSnmpLib;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
using System.Collections;

namespace Testprogi
{
    public partial class Form1 : Form
    {
  
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }
                

        private void button1_Click(object sender, EventArgs e)
        {
            discover();
           
        }
        public  void discover()
        {

            IDictionary<IPEndPoint, Variable> agents = Manager.Discover(VersionCode.V2, new IPEndPoint  (IPAddress.Broadcast, 161), new OctetString("public"), 100);
            foreach (KeyValuePair<IPEndPoint, Variable> pair in agents)
            {
              listBox_items.Items.Add(pair.Key + " announces " + pair.Value.Data);
            }

            //Console.Write("Press any key to continue . . . ");
            //Console.ReadKey(true);
           
        }

       
    }


Wenn ich das Programm starten bzw. debuggen will kommt in der Ausgabe folgende Meldung:
The thread 0xb64 has exited with code 0 (0x0).


Was kann das sein?
}

Moderiert von user profile iconKha: C#-Tags hinzugefügt


jaenicke - Mo 09.03.09 19:29

Hast du denn eine echte Windows Forms Anwendung? Denn wenn das Formular nicht angezeigt wird, dann nutzt es dir auch nix, und das passiert in der main-Methode.

Bitte setze deinen Quelltext hier im Forum in C#-Tags indem du entweder vor und nach dem Quelltext unter Bereiche auf das + neben C# klickst oder indem du den Quelltext markierst und einmal drauf klickst.
Du kannst es auch manuell so schreiben:

Quelltext
1:
<span class="inlineSyntax">{PROTECTTAG4365db6a7f646de851617c84df4e6fc4}</span>                    


asterix76 - Mo 09.03.09 19:42

Jo erst einmal sorry, mit dem Style für den Sourcecode.

Wie bekomme ich diesen Sourcecode zu einer WinForm Anwendung:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
/*
 * Created by SharpDevelop.
 * User: lextm
 * Date: 2008/8/9
 * Time: 12:24
 * 
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 */

using System;
using System.Collections.Generic;
using System.Net;
using Lextm.SharpSnmpLib;
namespace TestDiscovery
{
    class Program
    {
        public static void Main(string[] args)
        {
            IDictionary<IPEndPoint, Variable> agents = Manager.Discover(VersionCode.V2, new IPEndPoint(IPAddress.Broadcast, 161), new OctetString("public"), 100);
            foreach (KeyValuePair<IPEndPoint, Variable> pair in agents)
            {
                Console.WriteLine(pair.Key + " announces " + pair.Value.Data);
                
            }

            Console.Write("Press any key to continue . . . ");
            Console.ReadKey(true);
        }

       
    }
}

Ich habe bereits eine neue Windows Form erstellt:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
using System;
using System.Collections.Generic;
using System.Net;
using Lextm.SharpSnmpLib;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
using System.Collections;

namespace SNMP_Discovery
{
    public partial class Form1 : Form
    {
  
        public Form1()
        {
            InitializeComponent();
        }

    private void button1_Click(object sender, EventArgs e)
        {
            discover();
           
        }
        public  void discover()
        {

            IDictionary<IPEndPoint, Variable> agents = Manager.Discover(VersionCode.V2, new IPEndPoint(IPAddress.Broadcast, 161), new OctetString("public"), 100);
            foreach (KeyValuePair<IPEndPoint, Variable> pair in agents)
            {
              listBox_items.Items.Add(pair.Key + " announces " + pair.Value.Data);
            }         
        }

       
    }

}

das Porg macht aber nichts und es kommt nach einiger Zeit die Meldung "Keine Rückmeldung"
Wenn ich eine MessageBox.Show Anweisung vor der IDictionary platziere, wird diese auch noch angezeigt.
Wenn ich die MessageBox aber danach vor die foreach-Schleife setze, kommt es nicht mehr.
Das heisst es muss ja schon bei der Erstellung des IDictionarys ein Fehler passieren.

Bitte helft mir. :-)


Kha - Mo 09.03.09 19:55

user profile iconasterix76 hat folgendes geschrieben Zum zitierten Posting springen:
Das heisst es muss ja schon bei der Erstellung des IDictionarys ein Fehler passieren.
Jupp, wenn auch eher eine Endlosschleife/Dead Lock/... als eine Exception, denn bei einer solchen müsste der Debugger anspringen. Der Bug muss also in dieser Library stecken.


asterix76 - Mo 09.03.09 20:08

Ist es denn wirklich ein Bug in der Library, wenn es mit der Kommando-Zeile funktioniert?


Kha - Mo 09.03.09 20:12

Wenn es an dieser einen Zeile hakt, bleiben nicht viele Alternativen übrig ;) .

PS: Du könntest beim "Hängen" auch mal im Debugger auf "Break" klicken und schauen, in welcher Methode er landet. Ohne Source der Lib wird dir das aber natürlich nicht allzu viel bringen.