InvalidOperationException - Beim beenden der Bearbeitung einer Zelle & Umzug in eine andere Zelle

Ich machte ein Programm, in dem ich wollte manuell aktualisieren die Daten der Grid-Ansicht.
-Habe ich eine Methode zum Aktualisieren der DGV, indem Sie es deaktivieren und dann wieder einsetzen der Daten.
-Mit dem designer, machte ich einen event-handler für die DGV ist CellEndEdit. Im Ereignishandler, der Daten aktualisiert wird & die DGV ' s custom erfrischende Methode aufgerufen wird.

Während das Programm läuft, wenn ich starten Sie die Bearbeitung einer Zelle & beenden Sie es, indem Sie einen anderen ein, wird eine Ausnahme geworfen:

InvalidOperationException
Operation ist nicht gültig, weil es Ergebnisse in einer reentrant Aufruf der SetCurrentCellAddressCore Funktion.

Visual C# - debugger markiert die Zeile, löscht die Daten : datagridview1.Zeilen.Clear();

Wenn Sie möchten, um das problem zu reproduzieren, erstellen Sie eine neue windows-form-Projekt mit visual c#, setzen Sie ein DataGridView-Objekt auf das Formular, und fügen Sie folgenden code für Form1 hinzu.cs:

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 Error___DataGridView_Updating___Cell_endedit
{
public partial class Form1 : Form
{
//Objects
DataTable dt;
DataColumn colID;
DataColumn colName;
DataColumn colInfo;
//Constructor
public Form1()
{
InitializeComponent();
Initialize_dt();
InsertSampleData_dt();
Initialize_dataGridView1();
}
//Methods
private void Initialize_dt()
{
dt = new DataTable();
//Building Columns
//ID
colID = new DataColumn();
colID.ColumnName = "ID";
colID.DataType = typeof(int);
dt.Columns.Add(colID);
//Name
colName = new DataColumn();
colName.ColumnName = "Name";
colName.DataType = typeof(string);
dt.Columns.Add(colName);
//Info
colInfo = new DataColumn();
colInfo.ColumnName = "Info";
colInfo.DataType = typeof(string);
dt.Columns.Add(colInfo);
}
private void InsertSampleData_dt()
{            
DataRow row; 
//0
row = dt.NewRow();
row["ID"] = 100;
row["Name"] = "AAAA";
row["Info"] = "First Record";
dt.Rows.Add(row);
//1
row = dt.NewRow();
row["ID"] = 101;
row["Name"] = "BBBB";
row["Info"] = "Second Record";
dt.Rows.Add(row);
//2
row = dt.NewRow();
row["ID"] = 102;
row["Name"] = "CCCC";
row["Info"] = "Third Record";
dt.Rows.Add(row);
}
private void Initialize_dataGridView1()
{
dataGridView1.AllowUserToAddRows = false;
//Data Grid Definitions
//     Row Header
dataGridView1.RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.DisableResizing;
dataGridView1.RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders;
//     ColumnHeaders
dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
//Building Columns
#region ID
{
DataGridViewColumn colSGID = new DataGridViewTextBoxColumn();
colSGID.Name = "ID";
colSGID.HeaderText = "#";
colSGID.ReadOnly = true;
colSGID.Visible = false;
colSGID.Resizable = DataGridViewTriState.False;
dataGridView1.Columns.Add(colSGID);
}
#endregion
#region Name
{
DataGridViewColumn colSGName = new DataGridViewTextBoxColumn();
colSGName.Name = "Name";
colSGName.HeaderText = "Name";
dataGridView1.Columns.Add(colSGName);
}
#endregion
#region Info
{
DataGridViewColumn colSGSubject = new DataGridViewTextBoxColumn();
colSGSubject.Name = "Info";
colSGSubject.HeaderText = "Description";
dataGridView1.Columns.Add(colSGSubject);
}
#endregion
Refresh_dataGridView1();
}
private void Refresh_dataGridView1()
{
int index;
dataGridView1.SuspendLayout();
dataGridView1.Rows.Clear();
//MessageBox.Show("Cleared Data. Rebuilding...");
foreach (DataRow row in dt.Rows)
{
index = dataGridView1.Rows.Add(new DataGridViewRow());
dataGridView1.Rows[index].Cells["ID"].Value = row["ID"];
dataGridView1.Rows[index].Cells["Name"].Value = row["Name"];
dataGridView1.Rows[index].Cells["Info"].Value = row["Info"];
//MessageBox.Show("row #" + index);
}
dataGridView1.ResumeLayout();
}
//Event Handlers
private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
bool toUpdate = false;
int id = (int)dataGridView1.Rows[e.RowIndex].Cells["ID"].Value;
string columnName = dataGridView1.Columns[e.ColumnIndex].Name;
string value = (string)dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value;
if (value == null)
{
value = string.Empty;
}
switch (columnName)
{
case "Name":
if (value == string.Empty)
{
MessageBox.Show("Name Can't Be Empty!");
}
else
{
toUpdate = true;
}
break;
case "Info":
toUpdate = true;
break;
}
if (toUpdate)
{
foreach(DataRow row in dt.Rows)
{
if ( (int)row["ID"] == id)
{
row[columnName] = value;
}
}
Refresh_dataGridView1();
}
}
}
}
  • Vergaß zu erwähnen. Nach dem einfügen den code, das Programm auszuführen, ist ein tun, die folgenden: 2) auf eine Zelle klicken (auswählen). 3) klicken Sie auf die Zelle wieder (in den Bearbeiten-Modus für es). 4) wählen Sie eine andere Zelle (Zelle Ende Bearbeiten Ereignis Auftritt, wird die Ausnahme geworfen werden sollte jetzt).
  • Ich Verstand Ihr problem... kann aber nicht verstehen, was Sie versuchen zu erreichen... bitte genaueres. Soweit ich verstehen kann, das Sie versuchen, zu aktualisieren, der Wert der Zelle... habe ich Recht...?
  • Ja, ich bin versucht, zu aktualisieren, der Wert der Zelle in der Datentabelle mit den Daten der Grid-Ansicht*. Ich manuell "Bindung" der Daten der Grid-Ansicht, so dass ich mehr Kontrolle über welche Werte kann oder kann nicht erlaubt werden. (*In meinem aktuellen "Projekt", allerdings bin ich die Aktualisierung ein typisiertes DataSet mit einer Tabelle-adapter)
InformationsquelleAutor | 2009-05-21
Schreibe einen Kommentar