小编lor*_*ert的帖子

为什么交叉线程以这种方式工作?

解决了

似乎奥利弗是对的.几次尝试后,我得到了异常,在调试模式下我得到了它.所以这一切都与时间有关.你还应该检查马修瓦特森的答案;)

首先是一个可以解释我困惑的小例子.

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)

c# multithreading winforms

10
推荐指数
1
解决办法
141
查看次数

c#类之间通信的最佳方式

现在我正在编写一个应用程序,并且我认为必须有一个更好的解决方案来解决我现在正在做的事情.

我有一个主窗口,它将处理程序的设置.然后我有更多的课程和窗口.例如,语言处理程序类和处理"main函数"所需的用户输入的表单.

但是,到现在为止,我总是必须将主窗口传递给每个类,因为语言处理程序应该能够更改主窗口的字符串.另一种形式也应该能够将数据传递给主窗口.

如果我们想象会有更多的类,每类都需要在主窗口的副本,这将消耗大量依赖于主窗口中的"大小"的资源.

那么,这些类之间是否有更好/更有效的通信方式.

c#

9
推荐指数
1
解决办法
7299
查看次数

运行时错误1004无法从源到dest复制表

真的很奇怪.让我试着解释发生了什么.我在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

excel vba excel-vba

5
推荐指数
1
解决办法
6298
查看次数

c#如何获得添加的活动?

我坐在我的电脑前面想知道如何获得所有添加的事件.我刚看了一些文章,包括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)

c# events delegates

4
推荐指数
1
解决办法
1186
查看次数

如何通过cmd或VBA删除文件的写保护?

我正在为一个单词和excel编写一个宏.输出是应该保存的生成文件.由于这些文件已经存在并且受到写保护,因此我不得不删除保护.我在excel中找到了一个unprotect函数,但它并没有真正起作用.我也没有找到任何通过cmd o0取消保护的命令

我想在保存新文件之前删除文件.但我想找到解除保护的解决方案.

vba cmd

1
推荐指数
2
解决办法
1万
查看次数

如何解析List或2D数组,因为IEnumerable <T>不起作用?

抱歉这个令人困惑的问题,但我真的不知道如何更好地摆出姿势.也许一些代码更好地可视化我的问题.

我一开始的所作所为

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.

我认为用IEnumerable替换List将是解决方案

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来解决这个问题?

c#

1
推荐指数
1
解决办法
241
查看次数

标签 统计

c# ×4

vba ×2

cmd ×1

delegates ×1

events ×1

excel ×1

excel-vba ×1

multithreading ×1

winforms ×1