【问题标题】:BackgroundWork does not get value of ComboBox?BackgroundWork 没有得到 ComboBox 的值?
【发布时间】:2016-06-27 07:53:33
【问题描述】:

我有一个对象组合框,我确实将这些值插入到我的数据库中,它可以工作。现在我正在尝试创建一个 BackgroundWorker 来插入和控制 Form 的组件,例如按钮和进度以及 ComboBox 本身。问题是添加 BackgroundWorker 后,我无法在 ComboBox 中选择值,我无法理解这是什么问题。

我该如何解决?

插入方法

/** insere Perfil + Modulo */
        private void insertPerfilModulo() {            
            Perfil perfil = (Perfil)cbxPerfilModulo.SelectedItem;
            IList<Modulo> lista = getListaModulo();

            foreach(Modulo m in lista){                
                Permissao permissao = new Permissao();
                permissao.perfil = perfil;
                permissao.modulo = m;

                Boolean exist = dao.isExistPerfilAndModulo(permissao);                
                if (exist) {
                    Permissao p = dao.getPermissao(permissao);                    
                    dao.update(p);
                }else {
                    dao.insert(permissao);
                }
            }
        }

启动BackgroundWorker的按钮

private void btnSalvarPM_Click(object sender, EventArgs e) {    
    if (!backgroundWorker1.IsBusy) {
        progressBar1.Visible = true;                
        cbxPerfilModulo.Enabled = false;
        btnSalvarPM.Enabled = false;
        backgroundWorker1.RunWorkerAsync();
    }            
}

DoWork

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) {
            insertPerfilModulo();
        }

例外

The thread '<No Name>' (0x1870) has exited with code 0 (0x0).
'PubControl.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Numerics\v4.0_4.0.0.0__b77a5c561934e089\System.Numerics.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
A first chance exception of type 'System.InvalidOperationException' occurred in System.Windows.Forms.dll
The program '[5396] PubControl.vshost.exe: Program Trace' has exited with code 0 (0x0).
The program '[5396] PubControl.vshost.exe: Managed (v4.0.30319)' has exited with code -1 (0xffffffff).

【问题讨论】:

    标签: c# backgroundworker


    【解决方案1】:

    您正在尝试从后台工作人员访问 UI 线程。这是不允许的。

    您需要向后台工作人员传递完成其业务所需的所有信息 - 在本例中是从组合框中选择的项目。

    在这种情况下,你会得到这样的东西:

      backgroundWorker1.RunWorkerAsync(cbxPerfilModulo.SelectedItem);
    

    然后在工人中:

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        Perfil perfil = (Perfil)e.Argument;
        insertPerfilModulo(perfil);
    }
    

    您需要更改方法以接受正在处理的项目的参数。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-12
    • 2023-03-04
    • 1970-01-01
    • 2013-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多