none
String an bestimmter Stelle beschreiben RRS feed

  • Frage

  • Hallo, ich habe 2 strings, welche ich nun in eine listbox schreiben möchte:

    String 1 ist "Variable"    String2 ist "Wert"

    nun möchte ich sowas hier machen:

    listbox.items.add(Variable + "  " + Wert);
    

    Aber dann steht der Wert je nach länger des Variablennems einmal weiter hinten und einmal weiter Vorne. Gibt es da eine Möglichkeit den Wert immer untereinander stehend zu haben?

    Danke

    Sonntag, 5. September 2010 11:11

Antworten


  • doch es ist etwas aufgewählt, denn die abfrage mache ich erst, wenn sich die selection der listview ändert.

    Du vergisst hier, dass das SelectedIndexChanged Ereignis auch dann eintritt, wenn kein Element ausgewählt ist. Das kann beim Einfügen eines neuen Eintrags der Fall sein oder wenn ein anderer Eintrag ausgewählt wird. Hier wird bei einem ListView mit MultiSelect = false zunächst der aktuell markierte Eintrag deselektiert und danach der neue Eintrag markiert. Beide Aktionen haben jeweils ein SelectedIndexChanged Ereignis zur Folge, daher auch die Abfrage über die Count Eigenschaft. Ich gebe solche Beispiele nicht ohne Grund.

       	private void listView1_SelectedIndexChanged(object sender, EventArgs e)
        {
         int index = -1;
    
         if (listView1.SelectedIndices.Count != 0)
         {
          index = listView1.SelectedIndices[0];
         }
        }
    


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    • Als Antwort markiert Bensen83 Sonntag, 5. September 2010 20:28
    Sonntag, 5. September 2010 17:05
    Beantworter

Alle Antworten

  • Hallo,

    Hallo, ich habe 2 strings, welche ich nun in eine listbox schreiben möchte:

    String 1 ist "Variable"    String2 ist "Wert"

    nun möchte ich sowas hier machen:

    listbox.items.add(Variable + " " + Wert);
     

    Aber dann steht der Wert je nach länger des Variablennems einmal weiter hinten und einmal weiter Vorne. Gibt es da eine Möglichkeit den Wert immer untereinander stehend zu haben?

    das kannst Du besser lösen, indem Du statt der ListBox ein ListView in der Ansicht "Detail" verwendest. Dort hast Du die Möglichkeit mehrere Spalten zu definieren. Deine Variable würde in der ersten Spalte stehen und der Wert in der zweiten Spalte:

        private void Form1_Load(object sender, EventArgs e)
        {
         listView1.Columns.Add("Variable");
         listView1.Columns.Add("Wert");
         listView1.View = View.Details;
        }
    
        private void button1_Click(object sender, EventArgs e)
        {
         string var = "Var1";
         string value = "Value 1";
    
         listView1.Items.Add(new ListViewItem(new String[] {var, value}));
        }
    

    Wenn Du das mit einer ListBox erreichen möchtest, kannst Du über die CustomTabOffsets Eigenschaft eigene Werte für die Breite eines Tabsprungs angeben und so eine spaltenähnliche Anordnung erreichen, indem Du zwischen Variable und Wert einen Tabulator einfügst. Dazu musst Du jedoch wissen, wie lang der längste Name für 'Variable' sein kann, da sonst die Spalte einen "Sprung" macht, wenn der Bezeichner länger ist, als die übrigen Bezeichner und somit die Breite der ersten "Spalte" überschreitet:

        private void Form1_Load(object sender, EventArgs e)
        {
         listBox1.CustomTabOffsets.Add(50);
         listBox1.UseCustomTabOffsets = true;
        }
    
        private void button1_Click(object sender, EventArgs e)
        {
         string var = "Var 1"
         string value = "Value 1";
    
         listBox1.Items.Add(var + "\t" + value);
        }

    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    Sonntag, 5. September 2010 12:23
    Beantworter
  • Hallo B.,

    wenn man Deine Frage Deinem Wunsch gemäß beantworten würde, würde folgendes für Dich eine Lösung sein:

      ListBox lb = new ListBox(); lb.Width = 200;
      lb.Font = new Font("Courier New", Font.Size);
      string[] namen = new string[] { "Erster Name", "Zweiter Name", "Dritter" };
      int[] werte = new int[] { 11, 222, 3333 };
      string[] items = new string[namen.Length];
      string format = "{0,-12} = {1}"; // ohne "-" rechtsbündig
      //string format = "{0,-" + namen.Max(n=>n.Length)+"} = {1}"; 
      for (int i = 0; i < namen.Length; i++)
       lb.Items.Add(string.Format(format, namen[i], werte[i]));
      Controls.Add(lb);

    [Kombinierte Formatierung]    
    http://msdn.microsoft.com/de-de/library/txafckwd.aspx

    ____________________________

    Nun sind aber für Darstellungen exakt "untereinander" ansich auch andere Steuerelemente wie das DataGridView, oder das ListView und andere gut geeignet. Diese können ggf. auch visuelle Rahmenlinien geben/zeichnen, sodass die Übersichtlichkeit noch besser wird. Sie sind alle auch recht einfach implementierbar. Aber das musst Du aber wissen/entscheiden.


    ciao Frank
    Sonntag, 5. September 2010 12:46
  • OK aber bei der Listview kann ich ja nicht auf das selecteditem zugreifen, oder? zumindest wird es mir nicht aufgelstet.
    Sonntag, 5. September 2010 13:22
  • Hallo,

    OK aber bei der Listview kann ich ja nicht auf das selecteditem zugreifen, oder?

    beim ListView kann man über die SelectedItems Eigenschaft auf die ausgewählten Einträge zugreifen.

    Bspw.

    if (listView1.SelectedItems.Count != 0) 
    {
     string var = listView1.SelectedItems[0].Text;
     string val = listView1.SelectedItems[0].SubItems[1].Text;
    }
    
    

    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    Sonntag, 5. September 2010 13:36
    Beantworter
  • OK und kann man auch irgendwo herausfinden welches item ausgewählt ist? also sowas wie zb:

    ausgewähltes_item = listview.selecteditem;

    Sonntag, 5. September 2010 14:03
  • Hallo,

    OK und kann man auch irgendwo herausfinden welches item ausgewählt ist?

    ich verstehe Deine Frage nicht. Wie bereits geschrieben, liefert SelectedItems[0] den ausgwählten Eintrag.


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    Sonntag, 5. September 2010 14:47
    Beantworter
  • Ja, aber ich möchte zum Beispiel noch darstellen welche Zeile markiert wurde. Also einfach die Zahl wissen.

     

    Ich benötige winfahc nen Rückgabewert   wie zB. 5  --->   Zeile 5 Markiert.

    Weil ich auch irgendwo im Programm Zeilen markieren möchte.

    Also bei der Listbox géht das ja so:  listbox.selectedindex = 5;

    wie geht das bei ner listview?

    Sonntag, 5. September 2010 14:56

  • Ja, aber ich möchte zum Beispiel noch darstellen welche Zeile markiert wurde. Also einfach die Zahl wissen.

    Ich benötige winfahc nen Rückgabewert   wie zB. 5  --->   Zeile 5 Markiert.

    den Wert kannst Du entweder über die Index Eigenschaft des ListViewItem abfragen:

    int index = listView1.SelectedItems[0].Index;
    

    Oder über die SelectedIndices Eigenschaft:

    int index = listView1.SelectedIndices[0];
    
    

    Weil ich auch irgendwo im Programm Zeilen markieren möchte.

    Also bei der Listbox géht das ja so:  listbox.selectedindex = 5;

    wie geht das bei ner listview?

    Auswählen eines Eintrags:

    listView1.Items[5].Selected = true;
    

    Damit die Auswahl auch sichtbar ist, wenn das ListView nicht den Fokus hat, kann es sinnvoll sein die HideSelection Eigenschaft auf 'false' zu setzen.


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    Sonntag, 5. September 2010 15:14
    Beantworter
  • habe jetzt folgendes eingegeben:

    a = listview.SelectedItems[0].ndex;

    jetzt bekomme ich aber diese Fehlermeldung:

    InvalidArgument=Value mit dem Wert 0 ist für index ungültig

    Sonntag, 5. September 2010 15:31

  • habe jetzt folgendes eingegeben:

    a = listview.SelectedItems[0].ndex;

    jetzt bekomme ich aber diese Fehlermeldung:

    InvalidArgument=Value mit dem Wert 0 ist für index ungültig

    dann ist wohl kein Eintrag ausgewählt. Daher in meinem ersten Beispiel auch die Abfrage über SelectedItems.Count:

    if (listview.SelectedItems.Count != 0) 
    {
     a = listview.SelectedItems[0].Index;
    }
    
    Bei der ListBox bekommst Du über die SelectedIndex Eigenschaft -1 zurück, wenn kein Eintrag gewählt ist.

    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    Sonntag, 5. September 2010 15:55
    Beantworter
  • doch es ist etwas aufgewählt, denn die abfrage mache ich erst, wenn sich die selection der listview ändert. und das hat auch sicher nichts mit der 0 in den [] zu tun?

     

    Moment wenn ich ne 1 in die [] schreibe meckert er die an. anscheinend gehts wol doch nicht so mit dem index, oder?

     

    Ach ja und das mit dem aktivieren über items[i].selected funktioniert auch nicht :-(

    Sonntag, 5. September 2010 16:03
  • kannst du mir da vielleicht noch weiter helfen? Kome absolut nicht weiter :(((((
    Sonntag, 5. September 2010 16:38
  • Hallo B.,

    Zeig uns doch bitte Deinen Code (relevante Ausschnitte). So kann man besser verstehen, was nicht funktioniert. Thorsten hat Dir bereits einige sehr vernünftige Vorschläge gemacht, aber raten kann auch er nicht.

    Gruß
    Marcel

    Sonntag, 5. September 2010 16:48
    Moderator
  • das ist ein teil des codes, der nicht funktioniert:

     

    a = Vergleich_view.SelectedIndices[0];
        for (i = 0; i <= Vergleich_view.Items.Count - 1; i++)
        {
         Vergleich_view.Items[i].Selected = true; ;
         if (Vergleich_view.SelectedItems[0].Text == "" || Vergleich_view.SelectedItems[0].Text == null)
         {
          break;
         }
         else
         {
          sichern.WriteLine(Vergleich_view.SelectedItems[0].Text);
          sichern.WriteLine(Vergleich_view.SelectedItems[0].SubItems[1].Text);
          sichern.WriteLine(Vergleich_view.SelectedItems[0].SubItems[2].Text);
         }
        }
        Vergleich_view.Items[a].Selected = true;

    ich möchte mit i die zeiln hochzählen und "selecten" naja egal welche zahl i hat. beim schreiben in die datei hat selecteditems[0].Text immer den Wert der ersten Zeile. 

     

    ach ja, wennich über eien Button nur die Zeile

    Vergleich_view.Items[a].Selected = true;

    ausführe, dann schein er das auch nicht zu kapiere dass es die zeile markieren soll.

    Sonntag, 5. September 2010 17:02

  • doch es ist etwas aufgewählt, denn die abfrage mache ich erst, wenn sich die selection der listview ändert.

    Du vergisst hier, dass das SelectedIndexChanged Ereignis auch dann eintritt, wenn kein Element ausgewählt ist. Das kann beim Einfügen eines neuen Eintrags der Fall sein oder wenn ein anderer Eintrag ausgewählt wird. Hier wird bei einem ListView mit MultiSelect = false zunächst der aktuell markierte Eintrag deselektiert und danach der neue Eintrag markiert. Beide Aktionen haben jeweils ein SelectedIndexChanged Ereignis zur Folge, daher auch die Abfrage über die Count Eigenschaft. Ich gebe solche Beispiele nicht ohne Grund.

       	private void listView1_SelectedIndexChanged(object sender, EventArgs e)
        {
         int index = -1;
    
         if (listView1.SelectedIndices.Count != 0)
         {
          index = listView1.SelectedIndices[0];
         }
        }
    


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    • Als Antwort markiert Bensen83 Sonntag, 5. September 2010 20:28
    Sonntag, 5. September 2010 17:05
    Beantworter
  • Danke so schein es zu funktionieren. kannst du mir vielleicht noch sagen, wie mann die breite der Spalten vorbelegen kann?
    Sonntag, 5. September 2010 17:55
  • Hallo B.,

    Probier's mal mit: Vergleich_view.Columns[0].Width = [wert]. 

    Und noch etwas: Wenn Dir Thorstens Antworten geholfen haben, solltest Du sie als Antwort und/oder als hilfreich markieren.

    s.a. Galileo Computing: Visual C# 2008:
    Das ListView-Steuerelement


    Gruß
    Marcel

    Sonntag, 5. September 2010 18:20
    Moderator
  • OK Danke euch nochmal für eure Super Hilfe.

     

    Eine Frage noch, wie kann man denn eine schon durch Projekt --> Windows Form hinzufügen    hinzugefgte Form öffnen?

     

    Funkioniert ja leider auch nicht mit . show();

    Sonntag, 5. September 2010 20:34
  • Hallo,

     Eine Frage noch, wie kann man denn eine schon durch Projekt --> Windows Form hinzufügen    hinzugefgte Form öffnen?

    Funkioniert ja leider auch nicht mit . show();

    warum sollte das nicht funktionieren?

    (new Form1()).Show();
    

    Welche Fehlermeldung bekommst Du?


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    Montag, 6. September 2010 04:59
    Beantworter