Laden...

Zu dumm für Listbox?

Erstellt von schaedld vor 17 Jahren Letzter Beitrag vor 17 Jahren 2.276 Views
schaedld Themenstarter:in
1.433 Beiträge seit 2006
vor 17 Jahren
Zu dumm für Listbox?

Hallo zusammen

Ich mühe mich gerade mit der Listbox in Windows Forms ab. Das OpenBook von Galileo empfielt für Einträge folgenden Code:


listBox1.Items.AddRange(new string[]{"Franz", "Joseph", "Uwe"});

Mein Code sieht so aus:


thisMain.listBox1.Items.AddRange(new string[] { "Server", "Clients" });

Nur werden dann in der ListBox beim Laden der Anwendung keine Items angezeigt 🤔

und ich bekommen dann, natürlich in folgendem Code


        public void datenAbfragen()
        {
            Main thisMain = new Main();
            
            AbfrageTableAdapters.TNSNAMES_NEWTableAdapter thisAdapter = new AbfrageTableAdapters.TNSNAMES_NEWTableAdapter();

       
            
            ArrayList arrLst = new ArrayList();

            if (thisMain.listBox1.SelectedItem.ToString() == thisMain.listBox1.Items[0].ToString())
            {
                arrLst.Add(thisAdapter.GetDataClients().ToString());
            }
            else
            {
                arrLst.Add(thisAdapter.GetDataServers().ToString());
            }

            thisMain.grdResults.DataSource = arrLst;
            
        }
//Code ist nur temporär und es kann sicher sein dass er nicht funktioniet. Aber //zuweilen muss ich ja zuerst die Items haben.

eine NullReferenceException...

Ich weiss nur nicht wo der Hase im Pfeffer liegt, wo doch eigentlich alles richtig gemacht ist (oder liegts am Wochenanfang und zuwenig Kaffee X()

Danke für eure Hilfe.

Grüsse
Daniel
Space Profile
Wer nicht fragt, der nicht gewinnt

4.221 Beiträge seit 2005
vor 17 Jahren

Vermutlich läuft dein Code zum Füllen gar nicht oder erst nach dem andern Code ab.

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

215 Beiträge seit 2004
vor 17 Jahren

Mit

Main thisMain = new Main();

erstellst Du eine neue Instanz der Klasse Main.

Ich denke mal, dass dort im Konstruktor die ListBox gefüllt wird.
Aber

thisMain.listBox1.SelectedItem

ist natürlich null, da ja kein Eintrag selektiert ist.

greetz
DaSchroeter

schaedld Themenstarter:in
1.433 Beiträge seit 2006
vor 17 Jahren

Ich habe eine Windows Form Anwendung.

Die Controls, welche ich im weiteren Code verwende habe ich in der Main.Designer.cs als public deklariert, damit in Program.cs darauf zugreifen kann.

Ich hab versucht die Items beim der Main-Methode in der Program.cs einzufügen, kein Resultat. Auch das Einfügung in der Main.cs (also die für das Formular laden verantwortlich ist) ergibt kein Resultat. Wann passiert das Reinladen der Item's? Eigentlich schon zu Beginn der Applikation oder?

Mein Code sieht so aus:

Main.cs


    public partial class Main : Form
    {
        public Main()
        {
            InitializeComponent();
        }

        private void Main_Load(object sender, EventArgs e)
        {

        }

        private void btnAbfrage_Click(object sender, EventArgs e)
        {
            Program Prog = new Program();
            Prog.datenAbfragen();
        }

die Program.cs


    public class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Main());                      
        }

        public void datenAbfragen()
        {
            Main thisMain = new Main();
            
            AbfrageTableAdapters.TNSNAMES_NEWTableAdapter thisAdapter = new AbfrageTableAdapters.TNSNAMES_NEWTableAdapter();

       
            
            ArrayList arrLst = new ArrayList();

            if (thisMain.listBox1.SelectedValue.ToString() == "Server")
            {
                arrLst.Add(thisAdapter.GetDataClients().ToString());
            }
            else
            {
                arrLst.Add(thisAdapter.GetDataServers().ToString());
            }

            thisMain.grdResults.DataSource = arrLst;
            
        }

Zu guter letzt sieht meine Main.Designer.cs so aus (Nur die Controls die ich brauche):


namespace ServiceMgmt
{
    
        private System.Windows.Forms.Label lblServiceName;
        public System.Windows.Forms.TextBox txtServiceName;
        private System.Windows.Forms.Label lblComputer;
        private System.Windows.Forms.Label lblServiceOptions;
        public System.Windows.Forms.ComboBox comboServiceState;
        public System.Windows.Forms.BindingSource bdngSrc;
        public Abfrage abfrage;
        public ServiceMgmt.AbfrageTableAdapters.TNSNAMES_NEWTableAdapter tNSNAMES_NEWTableAdapter;
        public System.Windows.Forms.DataGridView grdResults;
        private System.Windows.Forms.Button btnAbfrage;
        public System.Windows.Forms.ListBox listBox1;
    }
}

Sorry für das lange Posting, aber das sind die ersten Gehversuche in Windows Forms (Übrigens das Visual C# 2005 Buch von Microsoft hilft da nicht gerade viel... X( )

//EDIT: Klar ist die null, da ja keine Items beim Laden hinzugefügt werden.


thisMain.listBox1.SelectedItem

Grüsse
Daniel
Space Profile
Wer nicht fragt, der nicht gewinnt

S
1.047 Beiträge seit 2005
vor 17 Jahren

und wo taucht da jetzt

thisMain.listBox1.Items.AddRange(new string[] { "Server", "Clients" });

auf?

änder mal dein Main() in


public Main() {
  InitializeComponent();
  listBox1.Items.AddRange(new string[] { "Server", "Clients" });
  listBox1.SelectedIndex = 0;

}

du solltest aber die listbox noch so einschränken das auf jeden fall nur 1 auswählbar ist und nicht keins oder mehrere

6.862 Beiträge seit 2003
vor 17 Jahren

Was du da machst ist aber arg komisch 😉

Es ist einfacher wenn du die Program.cs in Ruhe lässt und dort nur die Main Funktion drin ist die dann die Form startet. Wenn du deine datenAbfragen dann auch in Main definierst hast du kein Problem mehr das irgendwas Null ist, wenn du vorher im Konstruktor oder im Load der Main die Daten in die ListView einfüllst.

Baka wa shinanakya naoranai.

Mein XING Profil.

S
1.047 Beiträge seit 2005
vor 17 Jahren

stimmt, hab ich garnet gesehen^^

deine methode datenAbfragen solltest du in die Klasse Main verschieben und entsprechend ändern. in deinem button_click rufst du die dann nur noch auf

anstelle von einer listbox solltest du eventuell in erwägung ziehen mit radiobuttons oder ein dropdownlist zu arbeiten... nimmt man imho eher für "wähle 1 aus x"


private void datenAbfragen() {
  //eventuell in konstruktor verlagern...
  AbfrageTableAdapters.TNSNAMES_NEWTableAdapter thisAdapter = new AbfrageTableAdapters.TNSNAMES_NEWTableAdapter();

  ArrayList arrLst = new ArrayList();
  if (listBox1.SelectedValue.ToString() == "Server") {
    arrLst.Add(thisAdapter.GetDataClients().ToString());
  } else {
    arrLst.Add(thisAdapter.GetDataServers().ToString());
  }
  grdResults.DataSource = arrLst;
}

private void btnAbfrage_Click(object sender, EventArgs e) {
  datenAbfragen();
}

schaedld Themenstarter:in
1.433 Beiträge seit 2006
vor 17 Jahren

@sheitmann
Toll funktioniert, ich seh die Einträge nun. Kann es sein dass sie nicht geladen wurde,weil sie gleich beim Zeitpunkt der Anwendungsinitialisierung geladen werden müssen?

@talla
Stimmt so gehts wohl einfacher. Ich wollte mal so den Ansatz denn ich übers Week-End im Buch gelesen habe in die Tat umsetzen...

So Danke auf jedenfall für eure Hilfe, muss dann wohl das Kapitel Windows Forms vorziehen 😉

Grüsse
Daniel
Space Profile
Wer nicht fragt, der nicht gewinnt

6.862 Beiträge seit 2003
vor 17 Jahren

Was fürn Ansatz soll das sein?

Meine das man die Datenabfrage auslagert in ne eigene Form z.B. bzw. in ne eigene Klasse wenn keine Oberfläche benötigt wird ist auf jedenfall sinnvoll, aber die Program.cs ist seit VS 2005 einfach nur sowas wie ne Startklasse wo das Programm startet. Mehr macht die idr. nicht. Dann lieber neue Forms, bzw. Klassen einfügen.

Baka wa shinanakya naoranai.

Mein XING Profil.

schaedld Themenstarter:in
1.433 Beiträge seit 2006
vor 17 Jahren

neue Forms, bzw. Klassen einfügen.

Da hast Du recht... Ich hätte wohl heute lieber im Bett bleiben sollen, ist nicht wirklich mein TAg 😭

Grüsse
Daniel
Space Profile
Wer nicht fragt, der nicht gewinnt