似乎奥利弗是对的.几次尝试后,我得到了异常,在调试模式下我得到了它.所以这一切都与时间有关.你还应该检查马修瓦特森的答案;)
首先是一个可以解释我困惑的小例子.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
namespace testCrossThreading
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
new Thread(ThreadJob).Start();
}
void ThreadJob()
{
//label1.Text = "1";
changeText(label1, "1");
}
void changeText(Label L, String message)
{
L.Text = message;
}
}
}
Run Code Online (Sandbox Code Playgroud)
所以现在我的问题是:如果我label1.Text = "1";在函数"ThreadJob"中取消注释,那么我会按预期得到一个Cross线程异常.但如果我留下评论,如示例所示它确实有效.但为什么?该子函数调用该函数,我不调用任何东西.所以它仍然是子线程,而不是改变标签imo文本的GUI线程.或者我错过了什么?
我会这样写的.
void ThreadJob()
{
Action a = () => label1.Text = "1";
this.Invoke(a);
}
Run Code Online (Sandbox Code Playgroud) 现在我正在编写一个应用程序,并且我认为必须有一个更好的解决方案来解决我现在正在做的事情.
我有一个主窗口,它将处理程序的设置.然后我有更多的课程和窗口.例如,语言处理程序类和处理"main函数"所需的用户输入的表单.
但是,到现在为止,我总是必须将主窗口传递给每个类,因为语言处理程序应该能够更改主窗口的字符串.另一种形式也应该能够将数据传递给主窗口.
如果我们想象会有更多的类,每类都需要在主窗口的副本,这将消耗大量依赖于主窗口中的"大小"的资源.
那么,这些类之间是否有更好/更有效的通信方式.
真的很奇怪.让我试着解释发生了什么.我在word中写了一个宏,它调用了一个excelfile的宏
Set excel = CreateObject("excel.application")
excel.Visible = True
excel.workbooks.Open FileName:=tablePath
IDcolumn = excel.Application.Run("main", generatedExelPath)
Run Code Online (Sandbox Code Playgroud)
从单词宏调用的"main"函数是"简单地"通过从被调用的excel文件中复制特定数据来生成新的excel文件.
所以我们得到了1个单词和2个excel文档.必须将一些excel1复制到excel2.
因此我使用:
For i = 0 To UBound(copySheets)
Windows(srcWinName).Activate
Sheets(copySheets(i)).Activate
Set AcSh = ActiveSheet
Windows(destWinName).Activate
If copySheets(i) = "config" Then
AcSh.Copy Before:=Sheets(1)
Else
AcSh.Copy After:=ActiveSheet
End If
Next i
Run Code Online (Sandbox Code Playgroud)
其中copySheets包含需要复制的工作表.但是复制命令会引发错误.像"无法从源复制到目标"导致目标的行和列少于源文件"
ATM excel1是xlsm因为它是一个xls没有发生这个错误文件.我想知道这行加上excel2是不是问题
Workbooks.Add Template:="Workbook"
Run Code Online (Sandbox Code Playgroud)
也许我应该使用另一个模板,但我不知道哪一个.
如果我创建一个空xlsm文件,保存它然后使用打开此空xlsm而不是命令之前不会发生错误.希望可以有人帮帮我.
啊,我应该提到的一件事是:如果我从word宏运行上面的excel宏,则会发生错误,但是当我关闭Word并手动执行excel宏时,它可以工作.
阿兰说,我刚刚改变了excel-options.在这里他的帖子.
哦,我知道为什么会这样.您必须更改默认的Excel格式:Orb> Excel选项> |保存| >以这种格式保存文件:"Excel Workbook(.xlsx)".您当前的设置将是Excel 97-2003工作簿(.xls). - 阿兰8月29日12:09
我坐在我的电脑前面想知道如何获得所有添加的事件.我刚看了一些文章,包括AC#Bedtime Story,以便更好地了解事件,我认为我现在有了主要的想法.但是我仍然无法弄清楚如何触发事件被触发时执行的方法/委托列表.实际上在我的情况下,如果我知道是否有任何方法/代表被分配给某个事件就足够了.例如:我正在使用Gma.UserActivityMonitor(用于键盘/鼠标挂钩)现在我想知道事件HookManager.KeyUp事件是否为空.如果为null,则添加委托喊.在我的情况下这一个\ /
HookManager.KeyUp += new KeyEventHandler(HookManager_KeyUp);
Run Code Online (Sandbox Code Playgroud)
示例代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Reflection;
using Gma.UserActivityMonitor;
namespace EventTest
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
HookManager.KeyUp += new KeyEventHandler(HookManager_KeyUp);
Delegate[] a = GetEventSubscribers(button1, "Click");
label1.Text = a[0].Method.ToString();
}
void HookManager_KeyUp(object sender, KeyEventArgs e)
{
/* Do something*/
}
bool NoEventAttached()
{
return false;
}
public static …Run Code Online (Sandbox Code Playgroud) 我正在为一个单词和excel编写一个宏.输出是应该保存的生成文件.由于这些文件已经存在并且受到写保护,因此我不得不删除保护.我在excel中找到了一个unprotect函数,但它并没有真正起作用.我也没有找到任何通过cmd o0取消保护的命令
我想在保存新文件之前删除文件.但我想找到解除保护的解决方案.
抱歉这个令人困惑的问题,但我真的不知道如何更好地摆出姿势.也许一些代码更好地可视化我的问题.
private void drawFields(Image img, List<Field> Fields , bool clear)
{
Graphics grx = Graphics.FromImage(pictureBox1.Image);
if(clear)
grx.Clear(Color.White);
foreach(Field f in Fields)
{
grx.DrawImage(img, f.x * Field.width, f.y * Field.height);
}
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我使用的是List.但我也有一个Field类型的二维数组(不是锯齿状).我不想复制我的代码并使用2d数组而不是列表编写相同的函数.此外,我不想将2d数组转换为列表,因为它不必要地使用cpu ressources.
private void drawFields(Image img, IEnumerable<Field> Fields , bool clear)
{
Graphics grx = Graphics.FromImage(pictureBox1.Image);
if(clear)
grx.Clear(Color.White);
foreach(Field f in Fields)
{
grx.DrawImage(img, f.x * Field.width, f.y * Field.height);
}
}
Run Code Online (Sandbox Code Playgroud)
如果它是一个"普通"数组,它将起作用.但是2D数组没有实现,IEnumerable<T>
所以下面的调用会给我一个错误(其中Field.allFields是2D数组)
drawFields(Field_n, Field.allFields, true);
Run Code Online (Sandbox Code Playgroud)
是否有其他东西比IEnumerable来解决这个问题?