System.InvalidOperationException

tabina

Mitglied
Hallo,

ich suche verzweifelt nach der Lösung für folgendes Problem:
Ein DataGridView enthält eine Tabelle mit Datensätzen. Jede Zeile enthält u.a. einen Dateinamen, der die Herkunft der anderen Daten aus der Zeile bezeichnet. Beim Klick auf den RowHeader soll ein externer Editor (Notepad++) gestartet werden und die entsprechende Datei geöffnet werden. Der User kann dann in der Datei Änderungen vornehmen. Einf FileSystemWatcher löst dann einen change-Event aus, wenn die Änderungen gespeichert werden. Die Datei wird dann neu eingelesen und mit der vorhandenen Tabelle gemergt.
Leider bekomme ich dabei zwei mal die Exception
Eine Ausnahme (erste Chance) des Typs "System.InvalidOperationException" ist in System.Windows.Forms.dll aufgetreten.
Bisher ist es mir nicht gelungen, die Exception abzufangen, und der Code läuft ansonsten auch ohne Probleme weiter bis zu einer weiteren Exception
Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement dataGridView erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde.

Hier etwas Beispielcode:
Code:
private void dataGridView_RowHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            try
            {
                DataGridView dgv = (DataGridView)sender;
                DataGridViewRow row = dgv.CurrentRow;
                Int32 line = Convert.ToInt32(row.Cells["Line"].Value.ToString());
                String path = row.Cells["Path"].Value.ToString();
                String filename = row.Cells["Filename"].Value.ToString();
                String file = DIR + path + "\\" + filename;

                FileSystemWatcher watcher = new FileSystemWatcher(DIR + path);
                watcher.Changed += new FileSystemEventHandler(OnFileChanged);
                watcher.EnableRaisingEvents = true;

                mProcess = new Process();
                mProcess.StartInfo.FileName = "..\\..\\Notepad++\\notepad++.exe";
                mProcess.StartInfo.Arguments = String.Concat("\"", "-n", line, " ", file, "\"");
                mProcess.Start();
                String prg = "..\\..\\Notepad++\\notepad++.exe";
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message.ToString());
                return;
            }
        }


private void OnFileChanged(object sender, FileSystemEventArgs e)
        {
            try
            {
                String file = e.FullPath;

                FileParser parser = new FileParser(file, null);
                parser.parse();
                parser.finalize();

                DataSet set = new DataSet();
                CreateXMLDataSet(ref set, "updateMerge", null);
                //the updated table to be merged into the existing
                DataTable mdt = set.Tables["updateMerge"];
                //The original table
                DataTable dt = mDataSet.Tables["Parameter"];

                //define primary keys
                String[] keys = { "Name", "Value" };
                mergeTables(ref dt, mdt, keys, true);

                //create data view of merged table
                mDataView = new DataView(dt);

                loadDataGridView();          //this is where the third exception occurs
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message.ToString());
                return;
            }
        }


private void mergeTables(ref DataTable trg, DataTable src, String[] keys, Boolean exclusive)
        {
            try
            {
                int numKeys = keys.Length;
                DataColumn[] dataPkeys = new DataColumn[numKeys];
                DataColumn[] mergePkeys = new DataColumn[numKeys];


                    for (Int32 i = 0; i < numKeys; i++)
                    {
                        dataPkeys[i] = trg.Columns[keys[i]];
                        mergePkeys[i] = src.Columns[keys[i]];
                    }
               
                //remove duplicate data rows from the tables to enable merging
                RemoveDuplicates(trg, dataPkeys);
                RemoveDuplicates(src, mergePkeys);

                //set primary keys
                trg.PrimaryKey = dataPkeys;
                src.PrimaryKey = mergePkeys;

                trg.AcceptChanges();             //this is where the first exception occurs
                //merge the two data tables and preserve the changes from the 'older' table
                //(the changes from that table will be merged into the new table)


                trg.Merge(src, false, MissingSchemaAction.Add);
                //this is where the second exception occurs

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message.ToString());
                return;
            }
        }

Ich hoffe ihr könnt mir helfen!

Danke schoon mal!

tabina
 
Leider bekomme ich dabei zwei mal die Exception
Eine Ausnahme (erste Chance) des Typs "System.InvalidOperationException" ist in System.Windows.Forms.dll aufgetreten.

tabina

Tja, sollte vorher wohl "Unterbrechen bei folgendem Ausnahmezustand" aktivieren...

Bekomme jetzt folgende Exception
Eine Ausnahme (erste Chance) des Typs "System.InvalidOperationException" ist in System.Windows.Forms.dll aufgetreten.
Zusätzliche Informationen: Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement dataGridView erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde.
 
Gern geschehen, wünsche ich dir auch.

2 Dinge aber noch:
Bitte markier den Thread als Erledigt
und wenn du das nächste mal Quellcode postest: Bitte setze ihne in code-Tags, das macht die Sache erhelbich leichter zu lesen. Danke :)
 

Neue Beiträge

Zurück