2016-05-31 8 views
-1

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

Antwort

1

Blick auf Änderungen, die ich unten an Verfahren hergestellt. Button Next sollte das nächste Panel anzeigen (nicht aktuell).

 private void btnNext_Click(object sender, EventArgs e) 
     { 

      // Next panel depends on item type selection 
      string itemTypeSelection = comboItemType.Text; 

      switch (elementTypeSelection) 
      { 
       case "ITEM_A": 
        panel2B.Visible = true; 
        panel2B.BringToFront(); 
        panel2B.Focus(); 
        elementTypeSelection = "ITEM_B"; 
        break; 
       case "ITEM_B": 
        panel2C.Visible = true; 
        panel2C.BringToFront(); 
        panel2C.Focus(); 
        elementTypeSelection = "ITEM_C"; 
        break; 
       case "ITEM_C": 
        panel2D.Visible = true; 
        panel2D.BringToFront(); 
        panel2D.Focus(); 
        elementTypeSelection = "ITEM_D"; 
        btnNext.Enabled = false; 
        break; 
       case "ITEM_D": 
        break; 
       default: 
        return; 
      } 

     } 
+0

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. –

+0

Der btnPrevious_Click sollte wie der btnNext_Click aussehen, aber statt A, B, C, D sollte D, C, B, A gehen. – jdweng

+0

Warum verwenden Sie SelectionChangeCommitted anstelle von SelectionChange? Lesen Sie die Dokumentation. – jdweng

Verwandte Themen