2 Stimmen

Wie man eine delegierte Methode für den Zugriff auf Datagridview-Steuerelement in c# erstellen?

M mit einem winForm und in diesem m mit BackGroundWorker Kontrolle, um die Formular-GUI aktiv zu halten. Jetzt greife ich auf datagridview von backgroundworker_doWork() Methode, so dass ich eine Delegierte Methode unten erstellt:

    delegate void updateGridDelegate();
    private void invokeGridControls()
    {
        if (autoGridView.InvokeRequired)
        {
            updateGridDelegate delegateControl = new    updateGridDelegate(invokeGridControls);
            autoGridView.Invoke(delegateControl);//here i need to do something to access autoGridView.Rows.Count
        }
    }

und in der backgroundworker_DoWork() Ereignis m Zugriff auf Datagridview als

int temp2noofrows = autoGridView.Rows.Count - 1;// here i dn't understand how to call my delegate method, so i can avoid cross threading access error

3voto

TalentTuner Punkte 17031

Versuchen Sie es mit Action Delegate und unter der Annahme, dass Sie .net 2.0 und höher verwenden

 autoGridView.Invoke(
            new Action(
                delegate()
                {
                    int temp2noofrows = autoGridView.Rows.Count - 1;// 
                }
        )
        );

0voto

jimplode Punkte 3454

Das Problem, das Sie mit Dingen wie diesem haben werden, ist, dass Sie eine sehr spezifische Aktualisierungsmethode benötigen, damit der Delegat ausgeführt wird. Zum Beispiel das Aktualisieren des Textes in einem Textfeld.

Erstellen Sie einen Delegaten, der die gleiche Signatur hat wie eine zuvor definierte Methode:

public delegate void UpdateTextCallback(string text);

In Ihrem Thread können Sie die Invoke-Methode für die TextBox aufrufen und den aufzurufenden Delegaten sowie die Parameter übergeben.

myTextBox.Invoke(new UpdateTextCallback(this.UpdateText), 
            new object[]{"Text generated on non-UI thread."});

Und dies ist die eigentliche Methode, die Ihren Code ausführt.

// Updates the textbox text.
private void UpdateText(string text)
{
  // Set the textbox text.
  myTextBox.Text = text;
}

Hinweis: Erstellen Sie keine Methode, die der EventHandler-Delegat-Signatur entspricht und übergeben Sie diese. Die Implementierung von Invoke in der Klasse Control berücksichtigt die an Invoke übergebenen Parameter nicht, wenn der Typ des Delegaten EventHandler ist. Sie übergibt das Steuerelement, für das Invoke aufgerufen wurde, als Absenderparameter sowie den von EventArgs.Empty zurückgegebenen Wert als e-Parameter.

In Ihrem Fall müssen Sie also sicherstellen, dass Sie alle Informationen eingeben, die Sie benötigen, um Ihr Raster zu aktualisieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X