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:
Ich hoffe ihr könnt mir helfen!
Danke schoon mal!
tabina
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