Hallo alle zusammen,
ich habe nun schon seit einigen Tagen ein Problem mit dem arbeiten in zwei threads. Leider habe ich noch nicht ganz verstanden wie ich den Handle erstelle in dem anderen thread. Ich würde mich freuen wenn jemand mir das zeigen könnte an meinem Bsp.
Fehlermeldung:
"Invoke oder BeginInvoke kann für ein Steuerelement erst aufgerufen werden, wenn das Fensterhandle erstellt wurde."
Folgende Situation: Ich habe ein DataGrid wo ich per MouseEventHandler die Zeilenummer bekomme. Diese schicke ich dann an ein anderes Form wo dann dieser Datensatz angezeigt werden soll.
Code in Form mit DataGrid:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29:
| void DgDetails_MouseDown(object sender, MouseEventArgs e) { Point pt = new Point(e.X, e.Y); DataGrid.HitTestInfo hti = dgDetails.HitTest(pt); dataGridRow = hti.Row; if (dataGridRow != -1) { this.stockAction.Show(); dgDetails.SelectionBackColor = Color.LightGray; dgDetails.Select(dataGridRow-1); } } void stripMenu_Watchlist_Click(object sender, EventArgs e) { try { Application.OpenForms["Calculator"].Focus(); Calculator calc = new Calculator(); calc.FillControls(dataGridRow); } catch { Calculator frm_Calculator = new Calculator(); frm_Calculator.Show(); Calculator calc = new Calculator(); calc.FillControls(dataGridRow); } } |
Hier habe ich das Problem das das ContextStripMenu immer oben in der linken Ecke erscheint. Habe schon versucht es über Location zu verändern aber nix. Jemand einen Tipp?
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| public delegate void SetStockDelegate(int dataGridRow); public void FillControls(int dataGridRow) { string connectionString = "provider=Microsoft.Jet.OLEDB.4.0;"+ "data source = C:\\TradingDiary.mdb"; conn = new OleDbConnection(connectionString); string commandString = "SELECT * from Watchlist"; dataAdapter = new OleDbDataAdapter(commandString, conn); InitializeCommands(); ds = new DataSet(); dataAdapter.Fill(ds, "Watchlist"); dataTable = ds.Tables["Watchlist"]; txt_stockId.BeginInvoke(new SetTextStockDelegate(FillControls)); txt_stockId.Text = dataTable.Rows[dataGridRow-1]["stockId"].ToString(); } |
Wäre glücklich über einen Denkanstoß.
Danke
tomylee
Moderiert von
Christian S.: Code- durch C#-Tags ersetztModeriert von
Christian S.: Topic aus Allgemeine .NET-Fragen verschoben am So 24.06.2007 um 12:49