TablelayoutPanel reagiert nicht richtig
-
So ich eröffne mal ein neues Thema da mir in meinem alten Beitrag nicht mehr geschrieben worden ist. Und zwar erzeuge ich ein Tablelayout panel so:
private TableLayoutPanel CreateLayoutpan() { pTablePanel = new TableLayoutPanel(); pTablePanel.Location = new Point(21, 627); pTablePanel.Size = new Size(1551, 223); pTablePanel.Enabled = true; pTablePanel.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right; pTablePanel.CellBorderStyle = TableLayoutPanelCellBorderStyle.Single; pTablePanel.ColumnCount = 7 + 2; pTablePanel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50)); for (int o = 1; o <= 7; o++) { pTablePanel.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize)); } pTablePanel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50)); pTablePanel.RowCount = 3; pTablePanel.RowStyles.Add(new RowStyle(SizeType.Percent, 10)); pTablePanel.RowStyles.Add(new RowStyle(SizeType.Percent, 70)); pTablePanel.RowStyles.Add(new RowStyle(SizeType.Percent, 20)); this.Controls.Add(pTablePanel); return pTablePanel; }
so weit so gut. Das Panel wird mit Pictureboxen gefüllt, was auch alles wunderbar funktioniert. Suche ich eine bestimmtes Bild auf dem Panel zeigt er auch die richtige Position an. Will ich das Bild ändern oder Löschen passiert aber einfach nichts und alles bleibt beim alten. Ich habe auch testeshalber einen Button eingefügt um das Komplette Panel unsichtbar zu machen mit pTablePanel.Visible = false; auch das funktioniert nicht, es bleibt einfach sichtbar. Hat irgendjemand eine Idee wodran das liegen könnt? Vielen Dank
-
tüfftüff schrieb:
Will ich das Bild ändern oder Löschen passiert aber einfach nichts und alles bleibt beim alten. Ich habe auch testeshalber einen Button eingefügt um das Komplette Panel unsichtbar zu machen mit pTablePanel.Visible = false; auch das funktioniert nicht, es bleibt einfach sichtbar.
Bestimmt ne Refrerenz auf das falsche Panel. Zeig mal den Code.
-
foreach (System.Windows.Forms.PictureBox pbs in this.pTablePanel.Controls) { if (pbs.Name == (sender.P_DISPLAYNAME + "s")) { MessageBox.Show(Convert.ToString(pTablePanel.GetCellPosition(pbs))); pbs.Visible = false; this.pTablePanel.Refresh(); } }
da suche ich nach den pictureboxen. und beim Programm start ruf ich das Panelzeugen so auf:
CreateLayoutpan()
-
wirklich keiner ne Ahnung?
übrigends wenn ich das TLP erst mit einem Buttonclick auf visible setze dann funktioniert es und er ändert das gewünschte bild....komisch alles
-
Es ist immer noch nicht ganz klar, ob es sich bei
pTablePanel
in beiden gezeigten Codestellen um die selbe Variable handelt.Ansonsten gäbe es noch so Dinge wie Debugger oder kleines Projekt erstellen (< 100 Zeilen), welches das Verhalten reproduziert und mit diesem ins Forum kommen.
Grüssli
PS: Wieso eigentlich überhaupt das Prefix p bei
pTablePanel
?
-
p für Person. kp warum ich das gemacht habe. habe das jetzt mal fix nur als eigentsändiges programm gemacht und da funktioniert es komischerweise ohne probleme....
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace WindowsFormsApplication1 { public partial class Form1 : Form { TableLayoutPanel pTablePanel; public Form1() { InitializeComponent(); } private TableLayoutPanel CreateLayoutpan() { pTablePanel = new TableLayoutPanel(); pTablePanel.Location = new Point(30, 155); pTablePanel.Size = new Size(400, 250); pTablePanel.Enabled = true; pTablePanel.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right; pTablePanel.CellBorderStyle = TableLayoutPanelCellBorderStyle.Single; pTablePanel.ColumnCount = Convert.ToInt16(this.textBox1.Text) + 2; pTablePanel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50)); for (int o = 1; o <= Convert.ToInt16(this.textBox1.Text); o++) { pTablePanel.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize)); } pTablePanel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50)); pTablePanel.RowCount = 3; pTablePanel.RowStyles.Add(new RowStyle(SizeType.Percent, 10)); pTablePanel.RowStyles.Add(new RowStyle(SizeType.Percent, 70)); pTablePanel.RowStyles.Add(new RowStyle(SizeType.Percent, 20)); return pTablePanel; } private void button1_Click(object sender, EventArgs e) { CreateLayoutpan(); this.Controls.Add(pTablePanel); Button[] btn = new Button[Convert.ToInt16(textBox1.Text)]; Label[] lbl_contact = new Label[Convert.ToInt16(textBox1.Text)]; for (int i = 0; i < (Convert.ToInt16(textBox1.Text)); i++) { btn[i] = new Button(); btn[i].Name = "btn" + i; btn[i].Size = new Size(120, 120); this.pTablePanel.Controls.Add(btn[i], 1+i, 1); } } private void button2_Click(object sender, EventArgs e) { foreach (System.Windows.Forms.Button btn in this.pTablePanel.Controls) { if (btn.Name == ("btn2")) { MessageBox.Show(Convert.ToString(pTablePanel.GetCellPosition(btn))); btn.Visible = false; } } } } }
ich weiß wirklich nicht mehr was ich noch nachschauen soll...
-
tüfftüff schrieb:
ich weiß wirklich nicht mehr was ich noch nachschauen soll...
Debugger anwerfen und Schritt für Schritt durchgehen.
Zudem dein kleines Programm mit dem grossen vergleichen. Wo sind die Unterschiede. Zeile für Zeile. Sowas kostet zum Teil massiv Zeit ... und endet meistens in einem dummen Fehler...Grüssli
-
kann es sein, dass es was dmait zu tun hat, das ich die Pictureboxen auf das TablePanel hinzufüge bevor ich das TablePanel in die Controls vom Form gepackt habe?
-
Mittlerweile läuft fast alles tutti. Danke erstmal. SO nun habe ich nur noch eine klitzekleine Frage. Und zwar fülle ich das Panel ja so. 1 Reihe Labels(name=lbl_xxx) In der 2. Reihe und 3. Reihe PictureBoxen. Nun möchte ich bei einem bestimmten ereignis bestimmte Bilder in der 3.Reihe ändern. Das funktioniert so weit auch ganz gut, solange keine Labels in der 1. Reihe sind. SInd Labels in der 1. Reihe dann kommt folgende Fehlermeldung:
Die Objekte des Typs "System.Windows.Forms.Label" kann nicht in den Typ "system.Windows.Forms.Picturebox" umgewandelt werden.
heisst ja nicht anderes das der versuct auch die Labels zu ändern. Von daher meine Frage, kann ich nicht einfach nur in einer Bestimmten Reihe nach meinen Controls suchen und nicht in dem ganzen TablelayoutPanel? Und wenn ja wie?
Grüße
Hier nochmal der Quelltext wo ich nach der Box suche:
foreach (System.Windows.Forms.PictureBox pbs in this.tableLayoutPanel1.Controls) { if (pbs.Name == (sender.P_DISPLAYNAME + "s")) { switch (sender.P_AVAILABILITY) { //hier wird das bild geändert } }
-
Ich habe praktisch nichts von dem Thread gelesen, aber ich würde mal vermuten, in der Controls-Collection sind auch Elemente drin, die _keine_ Pictureboxen sind und insofern schlägt dein impliziter Cast im Kopf der foreach-Schleife fehl.
Abgesehen davon ist die Methode GetControlFromPosition evtl. interessant für dich.
-
versuche das jetzt so:
string name = sender.P_Skypename + "s"; Picturebox pb = (Picturebox) tlp_contact.Controls.Find(name,true); pb.Image = newImage;
so oder so ähnlich habe ich es mir gedacht aber bei der ich die Picturebox zuweise kommt ein Konvertierungsfehler. Irgendwie steh ich grade mega auf dem schlauch. Wäre nice wenn mir jemand etwas helfen könnte