【发布时间】: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(...)。