2013-03-20 13 views
16

Ho TableLayoutPanel a cui aggiungo le righe in modo programmatico. L'utente sceglie fondamentalmente una proprietà e viene quindi visualizzata nella tabella insieme ad alcuni controlli. Penso di avere un problema di comprensione generale qui e cercherò di spiegarlo.Rimozione di una riga specifica in TableLayoutPanel

Uno dei controlli in ogni riga è un pulsante "Elimina". Quel pulsante dovrebbe cancellare la riga in cui si trova. Quello che ho fatto è aggiungere un eventhandler al pulsante e impostare il conteggio corrente.

deleteTalent.Click += (sender, e) => buttonClickHandler(numberOfRows); 

codice del gestore:

private void buttonClickHandler(int rowCount) 
{ 
    int count = rowCount - 1; 
    for (int i = count; i < (count + 5); i++) 
    { 
     balanceTable.Controls.RemoveAt(count); 
    } 
    balanceTable.RowStyles.RemoveAt(count); 
    balanceTable.RowCount--; 

} 

ho guardato per ore e suonato in giro. Ma non riesco a trovare una soluzione pulita funzionante. Sono anche abbastanza nuovo per C#

Ecco la funzione completa che crea una nuova riga:

private void addBalanceItems(ToolStripMenuItem item) 
{ 
    int numberOfRows = balanceTable.RowCount; 
    if (numberOfRows > 1) 
    { 
     balanceTable.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.AutoSize)); 

    } 
    balanceTable.Height = numberOfRows * 45; 
    Steigerungsrechner rechner = new Steigerungsrechner(); 
    string tag = item.Tag.ToString(); 

    //change that asap :(
    if (tag == "A") { rechner.column = 1; } 
    if (tag == "B") { rechner.column = 2; } 
    if (tag == "C") { rechner.column = 3; } 
    if (tag == "D") { rechner.column = 4; } 
    if (tag == "E") { rechner.column = 5; } 
    if (tag == "F") { rechner.column = 6; } 
    if (tag == "G") { rechner.column = 7; } 
    if (tag == "H") { rechner.column = 8; } 

    Label talentName = new Label(); 
    talentName.Text = item.Text; 
    talentName.Height = standardHeight; 
    talentName.TextAlign = ContentAlignment.MiddleLeft; 
    talentName.AutoSize = true; 
    Label cost = new Label(); 
    cost.TextChanged += (sender, e) => costChangeHandler(cost); 
    cost.Height = standardHeight; 
    cost.TextAlign = ContentAlignment.MiddleLeft; 
    TextBox startValue = new TextBox(); 
    startValue.TextChanged += (sender, e) => startValueChangeHandler(rechner, startValue, cost); 
    startValue.Height = standardHeight; 
    startValue.TextAlign = HorizontalAlignment.Center; 
    TextBox endValue = new TextBox(); 
    endValue.TextChanged += (sender, e) => endValueChangeHandler(rechner, endValue, cost); 
    endValue.Height = standardHeight; 
    endValue.TextAlign = HorizontalAlignment.Center; 
    Button deleteTalent = new Button(); 
    deleteTalent.Text = "x"; 
    deleteTalent.Click += (sender, e) => buttonClickHandler(numberOfRows); 
    deleteTalent.Height = standardHeight; 

    balanceTable.Controls.Add(talentName); 
    balanceTable.Controls.Add(startValue); 
    balanceTable.Controls.Add(endValue); 
    balanceTable.Controls.Add(cost); 
    balanceTable.Controls.Add(deleteTalent); 
    balanceTable.Visible = true; 
    balanceTable.RowCount++; 
} 

Qualsiasi aiuto sarebbe molto apprezzato! :)

risposta

20

Sì, la rimozione di una riga arbitraria da un TableLayoutPanel è per nulla intuitiva. Hanno davvero rovinato il design di questo.

L'unico modo per rimuovere le righe è impostare la proprietà RowCount. Questo da solo è abbastanza strano; quella proprietà sembra che dovrebbe essere di sola lettura e il codice che mi sembra sbagliato ogni volta che lo vedo.

Ma oltre a questo, la conseguenza di questo design è che non è possibile rimuovere le righe dal centro. La reimpostazione della proprietà RowCount causerà solo il taglio delle righe dalla parte inferiore.

La soluzione è un po 'ingombrante, con più passaggi da sbagliare:

  1. rimuovere i controlli dalla riga che si desidera eliminare
  2. Se del caso, spostare questi controlli ad un'altra riga.
  3. Sposta tutti i controlli nelle altre righe che seguono la riga che desideri eliminare su una riga.
  4. Infine, rimuovere l'ultima riga diminuendo il valore della proprietà RowCount.

Una rapida ricerca su Google rivela che qualcuno ha written and shared code che pretende di fare questo. È in VB.NET, ma dovrebbe essere easily translated nel tuo dialetto nativo.

Devo ammettere che sono stato conosciuto solo per punt e impostare lo RowHeight della riga che desidero "rimuovere" su 0. In questo modo, l'autosizing fa il lavoro per voi. Probabilmente vorrete comunque rimuovere i controlli che contiene.

+2

Solo per dichiarare esplicitamente qui, l'ultima riga viene rimossa solo se (almeno) ** nascondi ** tutti i controlli che contengono. Altrimenti la modifica del 'RowCount' non ha alcun effetto, le righe rimangono comunque visibili. – miroxlav

9

Il codice per rimuovere la riga nella posizione data è indicato di seguito. Una cosa da ricordare: i controlli che otteniamo da panel.GetControlFromPosition (...) devono essere visibili o altrimenti restituiranno valori null anziché controlli invisibili.

public void remove_row(TableLayoutPanel panel, int row_index_to_remove) 
    { 
     if (row_index_to_remove >= panel.RowCount) 
     { 
      return; 
     } 

     // delete all controls of row that we want to delete 
     for (int i = 0; i < panel.ColumnCount; i++) 
     { 
      var control = panel.GetControlFromPosition(i, row_index_to_remove); 
      panel.Controls.Remove(control); 
     } 

     // move up row controls that comes after row we want to remove 
     for (int i = row_index_to_remove + 1; i < panel.RowCount; i++) 
     { 
      for (int j = 0; j < panel.ColumnCount; j++) 
      { 
       var control = panel.GetControlFromPosition(j, i); 
       if (control != null) { 
        panel.SetRow(control, i - 1); 
       } 
      } 
     } 

     // remove last row 
     panel.RowStyles.RemoveAt(panel.RowCount - 1); 
     panel.RowCount--; 
    } 
+0

Buono. Vedi anche: [Come rimuovere un controllo da righe e colonne specifiche nel controllo tableLayoutPanel?] (Https://social.msdn.microsoft.com/Forums/windows/en-US/568937e6-6b08-4b22-aeee-5a33159752c3/ how-to-remove-a-control-da-specific-row-and-column-in-tablelayoutpanel-control-? forum = winforms & prof = richiesto) – Mohsen

0

rimuovere i controlli di rowCount esistenti in prima

for(int i = 0; i < panel.ColumnCount; i++){ 
    Control Control = panel.GetControlFromPosition(i, rowCount); 
    panel.Controls.Remove(Control); 
    } 

Quindi rimuovere fila

panel.RowStyles.RemoveAt(rowCount-1); 
0

Rimozione completa Tabella -

tableLayoutPanel1.Controls.Clear(); 
tableLayoutPanel1.RowStyles.Clear(); 

Impostare tua Headline della Tavola nuovo -

  tableLayoutPanel.RowCount = 1; 
      tableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Absolute, 20F)); 
      tableLayoutPanel.Controls.Add(new Label() { Text = "MONTH", Font = new Font("Century Gothic", 12, FontStyle.Bold), ForeColor = Color.LightGray }, 0, tableLayoutPanel.RowCount - 1); 
      tableLayoutPanel.Controls.Add(new Label() { Text = "YEAR", Font = new Font("Century Gothic", 12, FontStyle.Bold), ForeColor = Color.LightGray }, 1, tableLayoutPanel.RowCount - 1); 
      tableLayoutPanel.Controls.Add(new Label() { Text = "MEASURED WAFERS", Font = new Font("Century Gothic", 12, FontStyle.Bold), ForeColor = Color.LightGray }, 2, tableLayoutPanel.RowCount - 1); 

3 Columns - 1 Row

forse qualcuno può usare il mio codesnipped, funziona bene proprio ...

+0

Puoi ottenere il codice di cui sopra progettando manualmente il layout della tabella nella vista di progettazione e copiare il codice generato da VS. Cerca in 'YourForm.Designer.cs' dopo il nome del tuo tavolo. – GoTo

0

Non è possibile eliminare completamente una riga su tablelayoutpanel ma c'è una soluzione alternativa:

  1. Rimuovere tutti i controlli nella riga, più semplice se si conoscono i nomi dei controlli in quanto è possibile chiamare il metodo di smaltimento.
  2. impostare l'altezza della riga a forse 2px utilizzando il metodo stile fila (ad esempio tablelayoutpanel1.Rowstyle(index).height=2)

Per me questo ha funzionato meraviglie i, riga è stata completamente crollato fila indipendentemente l'indice di riga.