Как создать метод делегата для доступа к элементу управления datagridview в C #? - PullRequest
1 голос
/ 20 октября 2010

m имеет winForm и в этом m использует BackGroundWorker элемент управления для поддержания формы GUI активным. Теперь я обращаюсь к datagridview из метода backgroundworker_doWork(), поэтому я создал метод делегата ниже:

    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
        }
    }

и в событии backgroundworker_DoWork() m доступ к сетке данных как

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

Ответы [ 2 ]

1 голос
/ 20 октября 2010

Попробуйте с Action Delegate и при условии, что вы используете .net 2.0 и выше

 autoGridView.Invoke(
            new Action(
                delegate()
                {
                    int temp2noofrows = autoGridView.Rows.Count - 1;// 
                }
        )
        );
0 голосов
/ 20 октября 2010

Проблема, с которой вы столкнетесь при таких вещах, заключается в том, что для запуска делегата вам понадобится очень специфический метод обновления. Например, обновление текста в текстовом поле.

Создайте делегата с такой же подписью, как у метода, который был ранее определен:

public delegate void UpdateTextCallback(string text);

В вашем потоке вы можете вызывать метод Invoke в TextBox, передавая делегат для вызова, а также параметры.

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

И это фактический метод, который будет запускать ваш код.

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

Примечание. Не создавайте метод, соответствующий сигнатуре делегата EventHandler, и не передавайте его. Реализация Invoke в классе Control не будет учитывать параметры, переданные Invoke, если тип делегата - EventHandler. Он передаст элемент управления, который был вызван Invoke для параметра отправителя, а также значение, возвращаемое EventArgs.Empty для параметра e.

Так что в вашем случае вам необходимо убедиться, что вы передаете всю необходимую информацию для обновления вашей сетки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...