【问题标题】:C# Invoke a methodC# 调用方法
【发布时间】:2017-07-16 14:10:52
【问题描述】:

所以我想做的是调用一个方法,应该是这样的:

this.Invoke(new MethodInvoker(delegate {
    UIOperations.CustomizeGrid(radGridView3);
}));

现在我的问题是我不能在类中使用this.invoke。我将如何调用它?我要调用的方法是这样的:

public static void CustomizeGrid(RadGridView Gridview)
{
    for (int i = 0; i < Gridview.Columns.Count; i++)
    {
        Gridview.MasterTemplate.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill;
        Gridview.Columns[i].BestFit();
        Gridview.Columns[i].HeaderTextAlignment = ContentAlignment.MiddleLeft;

        if (Gridview.Columns[i].HeaderText == "Noter")
        {
            Gridview.Columns["Noter"].MaxWidth = 600;
        }
    }
    // Paint every second row
    Gridview.EnableAlternatingRowColor = true;
    ((GridTableElement)Gridview.TableElement).AlternatingRowColor = Color.Aqua;
    // Set row header column width
    Gridview.TableElement.RowHeaderColumnWidth = 32;
}

这是我要调用的地方:

public static void ExcelToGrid(OpenFileDialog openFileDialog1,RadProgressBar radProgressBar1,RadGridView radGridView3)
    {
        try
        {
            openFileDialog1.Filter = "Excel Files|*.xls;*.xlsx;*.xlsm";
            DialogResult result = openFileDialog1.ShowDialog();

            if (result == DialogResult.OK) // Test result.
            {
                DataTable dt = new DataTable("dataTable");
                DataSet dsSource = new DataSet("dataSet");
                dt.Reset();



                Excel.Workbook ExWorkbook;
                Excel.Worksheet ExWorksheet;
                Excel.Range ExRange;
                Excel.Application ExObj = new Excel.Application();

                ExWorkbook = ExObj.Workbooks.Open(openFileDialog1.FileName, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);
                ExWorksheet = (Excel.Worksheet)ExWorkbook.Sheets.get_Item(1);
                ExRange = ExWorksheet.UsedRange;

                for (int Cnum = 1; Cnum <= ExRange.Columns.Count; Cnum++)
                {
                    dt.Columns.Add(new DataColumn((ExRange.Cells[1, Cnum] as Excel.Range).Value2.ToString()));
                }
                dt.AcceptChanges();

                string[] columnNames = new String[dt.Columns.Count];
                for (int i = 0; i < dt.Columns.Count; i++)
                {
                    columnNames[0] = dt.Columns[i].ColumnName;
                }

                for (int Rnum = 2; Rnum <= ExRange.Rows.Count; Rnum++)
                {
                    int MaxValue = ExRange.Rows.Count;
                    DataRow dr = dt.NewRow();
                    for (int Cnum = 1; Cnum <= ExRange.Columns.Count; Cnum++)
                    {
                        if ((ExRange.Cells[Rnum, Cnum] as Excel.Range).Value2 != null)
                        {
                            dr[Cnum - 1] = (ExRange.Cells[Rnum, Cnum] as Excel.Range).Value2.ToString();
                        }
                    }
                    //Write progressbar
                    radProgressBar1.Maximum = MaxValue;
                    radProgressBar1.Step = 1;
                    radProgressBar1.Value1 = Rnum;
                    radProgressBar1.Text = "Åbner " + Rnum + "/" + MaxValue;

                    dt.Rows.Add(dr);
                    dt.AcceptChanges();
                }
                //Reset progressbar
                radProgressBar1.Value1 = 0;
                radProgressBar1.Text = "";
                //Close workbook
                ExWorkbook.Close(true, Missing.Value, Missing.Value);
                ExObj.Quit();

                if (radGridView3.InvokeRequired)
                {
                    radGridView3.BeginInvoke(new MethodInvoker(delegate { radGridView3.DataSource = dt; }));
                }

                //Disallow sorting
                for (int i = 0; i < radGridView3.Columns.Count; i++)
                {
                    radGridView3.Columns[i].AllowSort = false;
                }
            }
            this.Invoke(new MethodInvoker(delegate
            {
                UIOperations.CustomizeGrid(radGridView3);
            }));

        }
        catch (Exception ex)
        {
            Console.WriteLine(ex);
        }
    }

【问题讨论】:

  • 您需要添加一些关于MethodInvoker 必要性的上下文;为什么你不能在你的上下文中简单地运行UIOperations.CustomizeGrid(radGridView3);?在任何情况下,Invoke 应该运行是控件上的一个方法,您将要在其线程上调用该方法;可能在您的上下文中您可以通过某种方式访问​​它?
  • 哦,当然,这是因为我在线程中运行它。 (公寓状态为STA)
  • 您要放置第一行的类与控件的关系如何?
  • 我更新了帖子,希望对您有帮助吗?
  • 试试radProgressBar1.Invoke(...)

标签: c# methods invoke


【解决方案1】:

如果您想将当前设计保留在使用静态帮助器类的位置,则最好将确定是否需要在该静态方法中调用 Invoke 所需的逻辑,以便该方法的使用者没有处理那个。 RadGridView 是 Control 的子类,因此这些方便的属性可用于 RadGridView 的实例。

public static void CustomizeGrid(RadGridView Gridview)
{
   // check if Invoke is needed
   if (Gridview.InvokeRequired) 
   {
      // Yes, so invoke on the Control instance that was supplied
      Gridview.Invoke(new MethodInvoker(delegate {
        // makes the same call but now you''ll be on the UI thread
        CustomizeGrid(Gridview);
       }));
      return;
   } 

   // all your other logic here
}

静态UIOperations 类中该方法的使用者现在可以简单地调用

UIOperations.CustomizeGrid(radGridView3);

不必担心他们是否从 UI 线程调用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多