如何阻止Windows窗体关闭但在单击X时隐藏?

时间:2019-04-28 07:06:09

标签: c# winforms

我正在尝试一个点击事件,它将打开另一个表单。我不希望用户能够关闭此窗口,因为再次执行click事件时收到以下异常。

  

System.ObjectDisposedException:'无法访问已处置的对象。   对象名称:“ Form2”。

我不确定我是否正确实施了此操作,或者是否有更好的方法来完成此操作。

Form1


var inOffice = true;



function idleUser() {
		var time;
    var start = new Date().getTime();
    var idleTime = (new Date().getTime() - start) / 1000;
    window.onload = resetTimer;
    window.onmousemove = resetTimer;
    window.onmousedown = resetTimer;  // catches touchscreen presses as well
    window.ontouchstart = resetTimer; // catches touchscreen swipes as well
    window.onclick = resetTimer;      // catches touchpad clicks as well
    window.onkeypress = resetTimer;
    function isInactive() {
        console.log("You are not active");
        inOffice = false;
        if(idleTime) {
            alert("You've been active for " + idleTIme);
        }
    }

    function resetTimer() {
        clearTimeout(time);
        time = setTimeout(isInactive, 1000)
    }
}

idleUser();

Form2


public Form2 f = new Form2();

private void Btnsearch_Click(object sender, EventArgs e)
{
    f.Show();
}

3 个答案:

答案 0 :(得分:2)

订阅Form.OnClosing并在传递给处理程序的事件args上设置Cancel属性。这将告诉运行时取消关闭事件。

由于事件已被取消,因此您必须自己隐藏表单(当然,使用Hide())。

private void Form1_Closing(Object sender, CancelEventArgs e)
{
    this.Hide();
    e.Cancel = true;
}

答案 1 :(得分:0)

form2的实例应在事件内创建



private void Btnsearch_Click(object sender, EventArgs e)
{
Form2 f = new Form2();
    f.Show();
}

答案 2 :(得分:-1)

有两种方法可以解决这个问题。

在FormClosing事件中,隐藏表单并取消事件通常更为有效,但这可能需要额外的逻辑。

除非您在创建表单时需要运行一些昂贵的代码,否则这可能无关紧要,并且简单地允许表单正常关闭会更容易。

无论哪种方式,您特别需要做的就是将一些保护措施放入btnSearch处理程序中,以便它可以适当地响应f;形式的状态。

public Form2 f;
public void BtnSearch_Click(object sender, EventArgs e)
{
    if (f == null || f.IsDisposed || f.Disposing) f = new Form2(...);
    f.Show();
}