Invoke/BeginInvoke Handle erstellen

tomylee

Grünschnabel
Hallo zusammen,

ich muß jetzt leider eine billige Frage stellen aber ich bin seit ewigkeiten am durchdrehen da ich nicht verstehe wie ich den blöden Handler für mein Objekt ansprechen soll.

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:

Code:
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(); //Aufruf des ContextMenuStrip EventHandler
                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);
            }
        }

Übrigens habe ich hier das Problem dass das ContextStripMenu immer oben in der linken Ecke erscheint. Habe schon versucht es über Location zu verändern aber nix. Jemand einen Tipp?

Code in Form 2:

Code:
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();        
        }

Ich würde mich super über etwas hilfe freuen um das mal zu verstehen.

Vielen Dank
tomylee
 
Warum musst du hier überhaupt mit BeginInvoke arbeiten? Du bist doch ohnehin im gleichen Thread. Damit erübrigt sich das dann wieder.

@ContextMenu: Muss ich mir ansehen, kann ich so auf die Schnelle nicht sagen.
 
Misst, ich hatte im Kopf das bei einem neuen Fenster ein neuer thread geöffnet wird.
Aber dann verstehe ich nicht warum dann die TextBoxen nicht mit den Daten aus der Datenbank gefüllt werden. Der Zugriff ist OK denn wenn ich es auf einen Button lege dann funktioniert es.

Code:
		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.Text = dataTable.Rows[dataGridRow-1]["stockId"].ToString(); 
		}
 
Zuletzt bearbeitet:
Hmm .. es wird dieser Teil nicht funktionieren:
Code:
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);
}
Im try-Block erstellst du ein neues Formular (ich gehe davon aus, dass Calculator ein Formular ist), zeigst es aber nicht an. Im catch-Block würdest du zwar ein neues Formlar instanzieren und anzeigen, führst aber deine Methode auf einer zweiten Instanz aus, die allerdings wieder nicht angezeigt wird. Ich denke das solltest du bereinigen.
 
Oh man, das ist ja auch der absolute lacher (peinlich). Daskommt raus wenn man kopiert und testet ohne zu denken und zu löschen.
OK. catch haut jetzt hin aber try hab ich noch ein problem.

Wenn er das Form durch try findet dann wurde es vorher durch dieses Event aufgerufen

Code:
		void Btn_calcuClick(object sender, EventArgs e)
		{
			Calculator calc1 = new Calculator();
			calc1.Show();		
		}

Wie spreche ich das nun aber an? Wenn ich es so mache dann findet er calc1 natürlich nicht:

Code:
			try 
			{
				Application.OpenForms["Calculator"].Focus();
				calc1.FillControls(dataGridRow);
			}

Schon mal vielen Dank für deine Hilfe :)
Ich muß noch besser mein geschriebenes kontrollieren. Wenn ich überlege wie lange ich daran nun schon wieder sitze und dann so ein blöder Fehler :google:
 
Brauchst du den Button-Click-Handler (Btn_calcuClick) überhaupt? Wenn nein, kannst du die Form innerhalb deines try-Blockes instanzieren.
 
Ja brauche ich. Dieser Button ist in einem dritten Form von dem man Calculator leer starten kann. Das andere (try/catch) ist aus einem Form mit DataGrid wo ich dann einen bestimmten Datensatz in dieses Calculator Form laden will.
Aber ich will ja kein neue Instanz starten sondern die offene benutzen.
 
Zuletzt bearbeitet:
Ich löse das Problem jetzt einfach so indem ich das Form schließe und dann wieder neu erstelle. Ist nicht die feine Art aber in dieser Situation OK.

Habe schon die zwei Threads hier gefunden, aber muß mich bei gelegenheit noch mal genau mit beschäftigen um es zu benutzen
http://www.tutorials.de/forum/net-tutorials/185977-c-datenaustausch-zwischen-zwei-forms.html
http://www.tutorials.de/forum/net-cafe/219470-sub-aus-anderer-form-aufrufen.html


Das Problem zu dem ContextStripMenu und der Location habe ich jetzt auch die Lösung. Habe es nicht richtig angewendet.

Code:
this.stockAction.Location = new Point (e.X, e.Y);

Danke noch mal für die Hilfe :)
 
Zurück