Ich habe ein Multi-Panel-Formular mit dem Visual Studios Designer erstellt. Das Formular wird verwendet, um Elemente in einer Datenbank zu speichern. Der Benutzer fügt Informationen über das Element im ersten Formular hinzu und wählt dann das nächste Element aus, um dem Element Bilder hinzuzufügen. Unterschiedliche Gegenstände haben eine unterschiedliche Anzahl von Bildern.C# - Multiple Panel-Formular - ComboBox-Handler funktioniert nicht mehr, wenn zum nächsten Panel und zurück zum vorherigen gehen
Die Übergänge der Platten sind wie folgt:
Panel1 < -> Panel2a
Panel1 < -> Panel2b
Panel1 < -> Panel2c
Panel1 < -> Panel2d
Also für jedes gegebene Element, gibt es zwei Felder zu füllen. Es gibt 4 Versionen des zweiten Panels, die bestimmen, wie viele Bildboxen und "Browse" -Buttons vorhanden sind.
Eine ComboBox auf Panel1 bestimmt, welche Version von Panel2 ausgewählt ist. Mit der Schaltfläche "next" gelangen Sie zu panel2 und mit der Schaltfläche "previous" kehren Sie zu panel1 zurück.
Der Code ist wie folgt:
public partial class formAddItem : Form
{
// To browse for images
OpenFileDialog mImageBrowse = new OpenFileDialog();
// store image paths
string mImagePath1 = null;
string mImagePath2 = null;
// Constructor
public formAddItem()
{
InitializeComponent();
}
private void frmAddItem_Load(object sender, EventArgs e)
{
// Retrieve list of items from database, store in dataset
// ...
// List to use as DataSource
List<string> listItemType = new List<string>();
// Add items from dataset to a list and alter string for readability
foreach (ITEM_TYPERow itemTypeRow in mDataSet.ITEM_TYPE)
{
listItemType.Add("ITEM_" + itemTypeRow[0]);
}
comboItemType.DataSource = listItemType;
// set up current state
panel1.Visible = true;
panel1.BringToFront();
panel1.Focus();
btnNext.Enabled = true;
btnPrevious.Enabled = false;
}
private void btnNext_Click(object sender, EventArgs e)
{
// Next panel depends on item type selection
string itemTypeSelection = comboItemType.Text;
switch (elementTypeSelection)
{
case "ITEM_A":
panel2A.Visible = true;
panel2A.BringToFront();
panel2A.Focus();
break;
case "ITEM_B":
panel2B.Visible = true;
panel2B.BringToFront();
panel2B.Focus();
break;
case "ITEM_C":
panel2C.Visible = true;
panel2C.BringToFront();
panel2C.Focus();
break;
case "ITEM_D":
panel2D.Visible = true;
panel2D.BringToFront();
panel2D.Focus();
break;
default:
return;
}
// Set current state
btnNext.Enabled = false;
btnPrevious.Enabled = true;
}
private void btnPrevious_Click(object sender, EventArgs e)
{
btnPrevious.Enabled = false;
btnNext.Enabled = true;
panel1.Visible = true;
panel1.BringToFront();
panel1.Focus();
}
private void btnItemA1Browse_Click(object sender, EventArgs e)
{
// Set filter
mImageBrowse.Filter = "png files (*.png)|*.png";
mImageBrowse.FilterIndex = 1;
DialogResult userCickedOk = mImageBrowse.ShowDialog();
if (userCickedOk == DialogResult.OK)
{
mImagePath1 = mImageBrowse.SafeFileName;
pictureBoxItemA1.Image = new Bitmap(mImageBrowse.FileName);
}
}
private void btnItemA2Browse_Click(object sender, EventArgs e)
{
// Set filter
mImageBrowse.Filter = "png files (*.png)|*.png";
mImageBrowse.FilterIndex = 1;
DialogResult userCickedOk = mImageBrowse.ShowDialog();
if (userCickedOk == DialogResult.OK)
{
mImagePath2 = mImageBrowse.SafeFileName;
pictureBoxItemA2.Image = new Bitmap(mImageBrowse.FileName);
}
}
// Resets image stuff when a new item type is selected
private void comboItemType_SelectionChangeCommitted(object sender, EventArgs e)
{
// Clear images and image paths
mImagePath1 = null;
mImagePath2 = null;
...
pictureBoxItemA1.InitialImage = null;
pictureBoxItemA2.InitialImage = null;
...
}
}
Die comboItemType_SelectionChangeCommitted()
scheint zu funktionieren, wenn ich auf ‚Weiter‘ drücken und dann ‚zurück‘, wenn ich nicht für ein Bild sehen. Aber sobald ich stöbere, hören die Dinge auf zu arbeiten.
Es gibt einige andere Dinge, die sich, aber ich bin der Hoffnung, sie zu meinem Problem nicht relevant sind
Das Element wird auf Panel1 ausgewählt. Dann wird Panel2 basierend auf der aktuellen Auswahl ausgewählt. Das Programm wechselt zur richtigen Anzeige, aber wenn Sie zu Tabelle eins zurückkehren, funktioniert der ComboBox-Handler nicht mehr, wenn ComboBoxType vom Benutzer geändert wird. Es wählt nur einen Wert von panel2 aus, zu dem es geht, es durchläuft sie nicht. –
Der btnPrevious_Click sollte wie der btnNext_Click aussehen, aber statt A, B, C, D sollte D, C, B, A gehen. – jdweng
Warum verwenden Sie SelectionChangeCommitted anstelle von SelectionChange? Lesen Sie die Dokumentation. – jdweng