Добавление строки в DataGridView из потока - PullRequest
1 голос
/ 07 июня 2010

Я хотел бы добавить строки в DataGridView из двух отдельных потоков. Я пытался что-то с делегатами и BeginInvoke, но не работает.

Вот моя функция обновления строк, которая вызывается из другой функции в потоке.

    public delegate void GRIDLOGDelegate(string ulke, string url, string ip = "");
    private void GRIDLOG(string ulke, string url, string ip = "")
    {

        if (this.InvokeRequired)
        {
            // Pass the same function to BeginInvoke,
            // but the call would come on the correct
            // thread and InvokeRequired will be false.
            object[] myArray = new object[3];

            myArray[0] = ulke;
            myArray[1] = url;
            myArray[2] = ip;

            this.BeginInvoke(new GRIDLOGDelegate(GRIDLOG),
                                             new object[] { myArray });

            return;
        }

        //Yeni bir satır daha oluştur
        string[] newRow = new string[] { ulke, url, ip };
        dgLogGrid.Rows.Add(newRow);
    }

Ответы [ 4 ]

2 голосов
/ 12 августа 2013

Вы можете использовать следующий код:

   private void GRIDLOG(string ulke, string url, string ip = "")
    {
        object[] myArray = new object[] { ulke, url, ip};
        if (this.InvokeRequired)
            dgLogGrid.Invoke((MethodInvoker)(() => dgLogGrid.Rows.Add(myArray)));
        else dgLogGrid.Rows.Add(myArray);
    }
1 голос
/ 07 июня 2010

Вам необходимо передать массив параметров. Вы делаете ошибку при звонке this.BeginInvoke

Попробуй так:

this.BeginInvoke(new GRIDLOGDelegate(GRIDLOG), new object[] { ulke, url, ip });

Все остальное кажется правильным.

1 голос
/ 26 июня 2012

Надеюсь, это полезно =]

private object[] DatagridBuffer(Person p)
{
    object[] buffer = new object[1];
    buffer[0] = p.FirstName;
    buffer[1] = p.LastName;
    return buffer;
{

public void ListPeople() 
{
    List<DatagridViewRow> rows = new List<DataGridViewRow>();
    Dictionary<int, Person> list = SqlUtilities.Instance.InstallationList();
    int index = 0;
    foreach (Person p in list.Values) {
        rows.Add(new DataGridViewRow());
        rows[index].CreateCells(datagrid, DatagridBuffer(p));
        index += 1;
    }
    UpdateDatagridView(rows.ToArray());
}

public delegate void UpdateDatagridViewDelegate(DataGridViewRow[] list);
public void UpdateDatagridView(DataGridViewRow[] list)
{
    if (this.InvokeRequired)
    {
        this.BeginInvoke(
             new UpdateDatagridViewDelegate(UpdateDatagridView), 
             new object[] { list }
        );
    }
    else
    {
        datagrid.Rows.AddRange(list);
    }
}

Если вы обнаружите, что мой код неверен или его можно улучшить, оставьте комментарий.

1 голос
/ 07 июня 2010
this.BeginInvoke(new GRIDLOGDelegate(GRIDLOG),
        //error seems to be here -> new object[] { myArray });
        myArray) // <- how it should be

Обновление:

Вы также можете сделать это следующим образом:

BeginInvoke(new GRIDLOGDelegate(GRIDLOG), ulke, url, ip);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...