使用BeginInvoke的Gridview

问题描述 投票:0回答:1

需要你的帮助。我想做的是什么呢?我基本上是对定义的IP范围进行SNMP请求,并在DataTable上显示他们是否可到达Pingable。我可以把SNMP请求作为一个单独的任务运行,但我无法用结果更新DataTable。因为gridControl运行在自己的线程上。

请帮助我。我把我的代码粘贴在下面。

        public partial class Discovery : DevExpress.XtraEditors.XtraForm
{        
        DataTable dt = null;
        public Discovery()
        {
            InitializeComponent();
            simpleButton2.Enabled = false;
            dt = new DataTable();
            gridControl1.DataSource = CreateColumns(dt);
        }        

        private DataTable CreateColumns(DataTable dt)
        {
            dt.Columns.Add("#", typeof(int));
            dt.Columns.Add("IP Address", typeof(string));
            dt.Columns.Add("Username", typeof(string));
            dt.Columns.Add("Password", typeof(string));
            dt.Columns.Add("Firmware Version", typeof(string));
            return dt;
        }


        private async void simpleButton1_Click(object sender, EventArgs e)
        {
            await SnmpRequest();
            //dt = CreateData(0);
            //this.ShowGrid(dt);
            simpleButton2.Enabled = true;
        }

        private async Task SnmpRequest()
        {
            await Task.Run(() =>
            {
                for (int i = 130; i < 140; i++)
                {
                    string ipAddress = "192.168.10." + i;
                    try
                    {
                        var result = Messenger.Get(VersionCode.V1,
                                   new IPEndPoint(IPAddress.Parse(ipAddress), 161),
                                   new OctetString("public"),
                                   new List<Variable> { new Variable(new ObjectIdentifier("1.3.6.1.2.1.1.1.0")) },
                                   2000);


                        foreach (var el in result)
                        {
                           string[] obj = new string[2];
                            obj[0] = ipAddress;
                            obj[1] = el.Data.ToString();
                            MethodToAdd(obj);
                        }
                    }
                    catch (Exception ex)
                    {
                        string[] obj = new string[2];
                        obj[0] = ipAddress;
                        obj[1] = ex.Message;
                        MethodToAdd(obj);
                    }
                }
            });
        }

        delegate void test(object[] strArr);
        private void MethodToAdd(string[] str)
        {
            object[] objArr = new object[2];
            objArr[0] = str[0];
            objArr[1] = str[1];
            gridView1.BeginInvoke(new test(PutLog), new object[] { str });
        }

        private void PutLog(object[] obj)
        {
            gridView1.AddNewRow();
            gridView1.SetRowCellValue(gridView1.FocusedRowHandle, gridView1.Columns[0], "1");
            gridView1.SetRowCellValue(gridView1.FocusedRowHandle, gridView1.Columns[1], obj[0]);
            gridView1.SetRowCellValue(gridView1.FocusedRowHandle, gridView1.Columns[2], "3");
            gridView1.SetRowCellValue(gridView1.FocusedRowHandle, gridView1.Columns[3], "4");
            gridView1.SetRowCellValue(gridView1.FocusedRowHandle, gridView1.Columns[4], obj[1]);
            gridView1.UpdateCurrentRow();
        }


        private void PutLog(string[] str)
        {
            gridView1.AddNewRow();
            gridView1.SetRowCellValue(gridView1.FocusedRowHandle, gridView1.Columns[0], "1");
            gridView1.SetRowCellValue(gridView1.FocusedRowHandle, gridView1.Columns[1], str[0]);
            gridView1.SetRowCellValue(gridView1.FocusedRowHandle, gridView1.Columns[2], "3");
            gridView1.SetRowCellValue(gridView1.FocusedRowHandle, gridView1.Columns[3], "4");
            gridView1.SetRowCellValue(gridView1.FocusedRowHandle, gridView1.Columns[4], str[1]);
            gridView1.UpdateCurrentRow();

        }
}

输出:-如下图所示错误参数2:无法将测试转换为System.Action。

c# gridview datatable devexpress gridcontrol
1个回答
0
投票

方法 BeginInvoke 需要一个代表 不接受任何参数. 你要发送两个。

你可以简化你的代码,把

foreach (var el in result)
{
  string[] obj = new string[2];
  obj[0] = ipAddress;
  obj[1] = el.Data.ToString();
  MethodToAdd(obj);
}

foreach (var el in result)
{
  gridView1.GridControl.BeginInvoke((Action) (() => 
  {
    gridView1.AddNewRow();
    gridView1.SetRowCellValue(gridView1.FocusedRowHandle, gridView1.Columns[0], "1");
    gridView1.SetRowCellValue(gridView1.FocusedRowHandle, gridView1.Columns[1], ipAddress);
    gridView1.SetRowCellValue(gridView1.FocusedRowHandle, gridView1.Columns[2], "3");
    gridView1.SetRowCellValue(gridView1.FocusedRowHandle, gridView1.Columns[3], "4");
    gridView1.SetRowCellValue(gridView1.FocusedRowHandle, gridView1.Columns[4], el.Data.ToString());
    gridView1.UpdateCurrentRow();
  }));
}     

呼叫 BeginInvoke 在...上 GridControl 并在那里处理一切。

© www.soinside.com 2019 - 2024. All rights reserved.