同一表单上的2个事件处理程序的行为不同

时间:2011-09-21 19:13:57

标签: c# winforms events

我有2个事件处理程序附加到同一表单上的按钮。我想在方法运行时禁用表单并显示waitCursor,然后启用表单并将光标恢复为默认值。

这是奇怪的部分:几乎相同的代码,其中一个事件起作用,另一个不起作用!这可能有什么问题?

这个有效。

private void btnExceptionReport_Click(object sender, EventArgs e)
    {              
        lblStatus.Text = "Printing exception report.";

    ActiveForm.Cursor = Cursors.WaitCursor;
    //Form.ActiveForm.Enabled = false;

    if (DatabaseOps.printItemReport("Exceptions", cboEmployee.Text))
    {
        lblStatus.Text = "Exception report printed.";
    }
    else
    {
        MessageBox.Show("Error printing exception report.");
        lblStatus.Text = "Error printing Exception report.";
    }

    //Form.ActiveForm.Enabled = true;
    ActiveForm.Cursor = Cursors.Default;
}

当我尝试将光标更改回默认值时,这会引发错误,指出ActiveFormnull

private void btnWIPReport_Click(object sender, EventArgs e)
{       
    lblStatus.Text = "Printing WIP Materials report.";

    ActiveForm.Cursor = Cursors.WaitCursor;
    //Form1.ActiveForm.Enabled = false;

    if (DatabaseOps.printItemReport("WIP", cboEmployee.Text))
    {
        lblStatus.Text = "WIP Materials report printed.";
    }
    else
    {
        MessageBox.Show("Error printing WIP Materials report.");
        lblStatus.Text = "Error printing WIP Materials report.";
    }

    //Form1.ActiveForm.Enabled = true;
    ActiveForm.Cursor = Cursors.Default;   //This line gives error saying ActiveForm is null
}

2 个答案:

答案 0 :(得分:1)

您无需致电ActiveForm。只需使用它就可以了:

Cursor = Cursors.Default;

答案 1 :(得分:0)

如果您只使用标准的Cursor和WaitCursor,则只需设置在控件中定义的bool属性UseWaitCursor。

似乎在您的代码中,您的表单可以作为“this”访问。

或者,如果您将'sender'强制转换为Button(?)并对类型化结果调用FindForm()方法,则可以选择使用Form。

你应该添加一些try / finally块来恢复光标,即使在你的'处理'代码中出现异常