2016-03-27 9 views
1

Ich entwickle eine Windows Forms-Anwendung, die verwendet eine DataGridView Kontrolle. Diese DataGridView hat eine Zelle, die eine Schaltfläche enthält. Der Text Standardschaltfläche ist Start aber wenn ich versuche, es dynamisch zu ändern mag:Stackoverflow beim Wechsel DataGridViewButtonCell Wert

((DataGridViewButtonCell)Myrow.Cells[9]).Value = "End"; 

oder einfach wie

Myrow.Cells[9].Value = "End"; 

Es wirft Ausnahme folgende:

An unhandled exception of type 'System.StackOverflowException' occurred in System.Windows.Forms.dll 

Mein vollständiger Code ist wie dies:

void HighlightOnlineUsers() 
{ 
    foreach (DataGridViewRow Myrow in dataGridView1.Rows) 
    { 
      if (Convert.ToInt32(Myrow.Cells[8].Value) > 0) 
      { 
        Myrow.DefaultCellStyle.BackColor = Color.GreenYellow; 
        Myrow.Cells[9].Value = "End"; 
      } 
      else { 
        Myrow.DefaultCellStyle.BackColor = Color.White; 
        ((DataGridViewButtonCell)Myrow.Cells["SessionAction"]).Value = "Start"; 
      } 
    } 
} 
+1

Die Frage ist, wo nennst du 'HighlightOnlineUsers' von –

+0

@IvanStoev es ist in der Codedatei des' Form', in dem 'Datagridview 'ist gelegen. –

+1

Ich meine, sieht aus wie Sie es von einem Ereignis aufrufen, und die Implementierung löst das gleiche Ereignis, daher Stackoverflow. –

Antwort

3

Um einen anderen Text für Tasten haben Sie CellFormatting Ereignis des Rasters verarbeiten kann und die Logik legen Wert der Spalte dort für die Formatierung.

private void grid_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) 
{ 
    //If this is header row or new row, do nothing 
    if (e.RowIndex < 0 || e.RowIndex == this.grid.NewRowIndex) 
     return; 

    //I suppose your button is at index 9 
    if (e.ColumnIndex == 9) 
    { 
     //You can put your dynamic logic here 
     //and use different values based on other cell values 
     //for example based on cell at index 8  
     if (Convert.ToInt32(this.grid.Rows[e.RowIndex].Cells[8].Value) > 0) 
      e.Value = "End"; 
     else 
      e.Value = "Start"; 
    } 
} 

Sie sollten diese Prozedur zu CellFormating Ereignis zuordnen:

this.grid.CellFormatting += grid_CellFormatting; 
+0

Das funktioniert. Aber ich möchte dies auch vom 'dataGridView1_Sorted'-Ereignis aufrufen. Wie kann ich das machen? –

+1

Ich denke, es ist genug, um solchen Code in Zelle Formatierungsereignis zu haben. Wenn Sie eine spezifische Anforderung für Art oder etwas anderes benötigen, fühlen sich frei, eine andere Frage, und ich als andere Community-Mitglieder zu fragen, werden versuchen, Ihnen zu helfen, das Problem zu lösen. :) –

+0

Vielen Dank für Ihre Hilfe. Ich werde eine andere Frage stellen, wenn die Formatierung beim Sortieren nicht richtig funktioniert. :) –

0
for (int i = 0; i < dataGridView1.RowCount; i++) 
{ 
    dataGridView1.Rows[i].Cells["Buttons"].Value = "some value"; 
} 

Hinweis "Buttons" ist der Name der Spalte

+0

Wie unterscheidet es sich von meinem Ansatz? –

+0

Aargh! Du hast recht. Ich habe deinen Code nicht richtig gelesen – Eminem