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