Laden...

Strings in Listbox immer gleich lang machen

Erstellt von STF-DIR vor 10 Jahren Letzter Beitrag vor 10 Jahren 1.747 Views
S
STF-DIR Themenstarter:in
368 Beiträge seit 2006
vor 10 Jahren
Strings in Listbox immer gleich lang machen

Hallo zusammen,

also ich habe verschiedene Strings die ich aus einer Textdatei einlese:


Flight Deck Preperation.COMPLETED
Light Test.COMPLETED
Oxygen & Interphone.COMPLETED
Yaw Damper.ON
Doors.closed
Flight Deck Windows.locked
Air Condition Packs.Off
Electricat.Generators On
Probe Heat.On

Diese sollen in ein ListBox eingefügt werden.
Allerdings immer der linke teil des Strings, beim ersten string also

"Flight Deck Preperation"

Dann soll der String mit so vielen "." aufgefüllt werden, das der zweite Teil des Strings, also "COMPLETED" am rechten Rand der ListBox steht.

Also etwa so :

Flight Deck Preperation.........................COMPLETED

Bei den anderen soll das ganze auch so sein, und dabei sollen die Strings eben genau gleich lang sein.

Ich hab das mit dieser Funktion versucht:


		static public int MeasureDisplayStringWidth(Graphics graphics, string text, Font font)
		 {
		     const int width = 32;
		     System.Drawing.Bitmap   bitmap = new System.Drawing.Bitmap (width, 1, graphics);
		     System.Drawing.SizeF    size   = graphics.MeasureString (text, font);
		     System.Drawing.Graphics anagra = System.Drawing.Graphics.FromImage(bitmap);
		
		     int measured_width = (int) size.Width;
		
		     if (anagra != null)
		     {
		         anagra.Clear (Color.White);
		         anagra.DrawString (text+"|", font, Brushes.Black, width - measured_width, -font.Height / 2);
		
		         for (int i = width-1; i >= 0; i--)
		         {
		             measured_width--;
		             if (bitmap.GetPixel (i, 0).R != 255)    // found a non-white pixel ?
		                 break;
		         }
		     }
		
		     return measured_width;
		 } 		
		private void DisplayChecklist(int clNumber)
		{
			clbItems.Items.Clear();
			if(clNumber <=_clList.Count-1)
			{
				for(int x=0;x<_clList[clNumber].ItemList.Count;x++)
				{
					string all = _clList[clNumber].ItemList[x];
					string[] split = all.Split('.');
					string sleft = split[0];//.PadRight(40,'.');
					string sright = split[1];
					string smid = ".";
					
					Graphics g = clbItems.CreateGraphics();
					
					int lmid = MeasureDisplayStringWidth(g, smid, clbItems.Font);
					int lleft = MeasureDisplayStringWidth(g, sleft, clbItems.Font);
					int lRight = MeasureDisplayStringWidth(g, sright, clbItems.Font);
					int lSoll = clbItems.Width-lRight;

					while(lmid <= lSoll)
					{						
						lmid = MeasureDisplayStringWidth(g, smid, clbItems.Font);
						smid += ".";
					}
					
					string sAll = sleft + smid + sright;
					clbItems.Items.Add(sAll);
				}
			}
		}

Leider kommen trotzdem immer ungleich lange strings heraus und ich weiss nicht warum

Kann da jemand helfen?

Danke
Matthias

A
764 Beiträge seit 2007
vor 10 Jahren

Hallo STF-DIR,

die Methode, die du suchst heisst String.PadRight.

Gruß, Alf

Edit:
Was natürlich auch etwas ausmacht, ist die Schriftart. Verwende am einfachsten eine Schrifart, mit gleicher Länge pro Zeichen. Das nennt sich Monospace oder so.

S
STF-DIR Themenstarter:in
368 Beiträge seit 2006
vor 10 Jahren

Hallo,

cool, mit so ner Monospace Schrift geht PadRight.
Nun weiss ich nur noch nicht wie ich herausbekomme wieviele Zeichen insgesammt in das ListBox passen?

Matthias

S
STF-DIR Themenstarter:in
368 Beiträge seit 2006
vor 10 Jahren

Hallo,

ahh, ich habs .. das geht mit der MesureString wiederum.

Danke Dir
Matthias

49.485 Beiträge seit 2005
vor 10 Jahren

Hallo STF-DIR,

warum so umständlich? Nimm besser ein ListView oder ein DataGridView mit zwei Spalten.

Bei einem ListView kann man die Breite einer Spalte automatisch auf den längsten Eintrag setzen, siehe ColumnHeader.Width-Eigenschaft.

herbivore

S
STF-DIR Themenstarter:in
368 Beiträge seit 2006
vor 10 Jahren

Hallo,

hmm, auch eine Idee...Danke Dir

Matthias

5.299 Beiträge seit 2008
vor 10 Jahren

Falls eine kompliziertere Verarbeitung dahintersteht, würde ich dazu raten, ein entsprechendes Datenmodell in einem typisierten Dataset anzulegen.
Aus Datenbänker-Sicht gesehen verstößt deine Tabelle nämlich gegen die 3.Normal-Form, was bei der Datenverarbeitung dann gewisse Möglichkeiten ausschließt - etwa, dass man die Werte hinter dem "." per Combobox innerhalb eines DatagridViews präsentieren und auswählbar machen könnte.
Zur Theorie relationaler Datenmodelle gugge die relationale GrundIdee - da ist auch ein CodeSample mit so ComboboxDatagridViewColumns dabei.

Beachte: Auf diese Weise kannst du datenbänkerisch programmieren, ohne tatsächlich eine Datenbank zu brauchen - das typisierte Dataset kann sich auch so direkt auf Platte schreiben.

Der frühe Apfel fängt den Wurm.