【问题标题】:Gridview with BeginInvoke带有 BeginInvoke 的 Gridview
【发布时间】:2020-05-13 14:17:36
【问题描述】:

在这里需要您的帮助。 我想做什么? 我基本上是对定义的 IP 范围发出 SNMP 请求,如果它们可访问/可 Ping,则将它们显示在 DataTable 上。我能够发出作为单独任务运行的 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】:

    方法BeginInvoke 需要takes no parameters 的委托。你要发送两个。

    您可以简化代码并替换

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

    GridControl 上致电BeginInvoke 并处理那里的一切。

    【讨论】:

    • codeGridControl1code 上调用了codeBeginInvokecode,它开始为我工作。但是,我尝试按照您的建议简化我的代码。谢谢@Marko。
    • 有什么办法可以并行执行上面的任务吗?我不想一一发送 SNMP 请求,而是想一次拍摄所有请求并根据任务状态填充表。
    • 我看不出任何原因,为什么不呢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-15
    • 2011-02-04
    • 2019-09-25
    • 2018-03-27
    • 2023-03-08
    相关资源
    最近更新 更多