簡體   English   中英

當我點擊右上角的 X 按鈕時程序沒有關閉(Visual Studio、Forms、C#)

[英]Program doesn't close when I hit the X button top right (Visual Studio, Forms, C#)

如果我按下 X 按鈕,它根本沒有反應。 甚至 alt+f4 都不起作用

起初我讀入兩個excel文件,讀出的數據用於一些計算。 編輯:可能是互操作問題:

 System.Data.DataTable dt = new System.Data.DataTable();
            try
            {
                xlApp = new Excel.Application();
                Workbook workbook = xlApp.Workbooks.Open(filePath);
                xlBook = workbook;
                dynamic xlSheet = xlBook.Worksheets[sheetName];
                dynamic xlRange = xlSheet.UsedRange;
                DataRow row = null;
                for (int i = 1; i <= xlRange.Rows.Count; i++)
                {
                    if (i != 1)
                        row = dt.NewRow();
                    for (int j = 1; j <= xlRange.Columns.Count; j++)
                    {
                        if (i == 1)
                            dt.Columns.Add(xlRange.Cells[1, j].value);
                        else
                            row[j - 1] = xlRange.Cells[i, j].value;
                    }
                    if (row != null)
                        dt.Rows.Add(row);
                }
                xlApp = null;
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            finally
            {
                xlBook.Close();
                //xlApp.Quit();
                if (xlApp != null)
                {
                    xlApp.Quit();
                    xlApp = null;


                }

            }

每次您點擊表單上的添加按鈕時,都會開始計算並將一行添加到網格視圖中。

編輯:我觸發了一個事件來關閉應用程序,但它仍然不起作用:

private const int WM_CLOSE = 0x0010;
protected override void WndProc(ref Message m)
{
    if (m.Msg == WM_CLOSE)
    {
        var autoValidate = this.AutoValidate;
        this.AutoValidate = AutoValidate.Disable;
        base.WndProc(ref m);
        this.AutoValidate = autoValidate;
    }
    else
        base.WndProc(ref m);
}
     protected override void OnFormClosing(FormClosingEventArgs e)
        {
            base.OnFormClosing(e);

            if (e.CloseReason == CloseReason.WindowsShutDown) return;

            // Confirm user wants to close
            switch (MessageBox.Show(this, "Are you sure you want to close?", "Closing", MessageBoxButtons.YesNo))
            {
                case DialogResult.No:
                    e.Cancel = true;

                    break;
                default:
                    break;
            }
        }

您的應用程序陷入了循環遍歷 Excel 文件的所有內容的緊密循環中,並且沒有將控制權釋放回 UI 線程以便它可以處理事件。

在最外層for循環的底部,調用Application.DoEvents()以允許 UI 更新並響應表單和控件事件。

根據您最后的評論,它可能確實是一個互操作問題,我想發布一個使用Microsoft.Office.Interop.Excel以正確處理它的最小示例。 由於此示例有意遺漏了代碼的System.DataTable方面,因此希望它能幫助您隔離問題。


初始化 _xlApp 成員變量

    public MainForm()
    {
        InitializeComponent();
        _xlApp = new Microsoft.Office.Interop.Excel.Application();            
    }
    private readonly Application _xlApp;
    private Workbook _xlBook = null;

使用Dispose方法(這可能位於MainForm.Designer.cs文件中)退出 Excel 應用程序實例。

    protected override void Dispose(bool disposing)
    {
        if (disposing)
        {
            if (components != null)
            {
                components.Dispose();
            }
            _xlBook?.Close();
            _xlApp.Quit();
        }
        base.Dispose(disposing);
    }

使用 Excel Visible 復選框顯示/隱藏應用程序

    private void checkBoxExcelVisible_CheckedChanged(object sender, EventArgs e)
    {
        Cursor = Cursors.WaitCursor;
        BeginInvoke((MethodInvoker)delegate 
        {
            _xlApp.Visible = checkBoxExcelVisible.Checked; 
            checkBoxWorkbookOpen.Visible = _xlApp.Visible;
            Cursor = Cursors.Default;
        });
    }

顯示excel


使用 Workbook Open 復選框與工作簿單元格交互並將它們復制到文本框。

    private void checkBoxWorkbookOpen_CheckedChanged(object sender, EventArgs e)
    {
        if (checkBoxWorkbookOpen.Checked)
        {
            var filePath = System.IO.Path.Combine(
                AppDomain.CurrentDomain.BaseDirectory,
                "Excel",
                "TestCells.xlsx");

            _xlBook = _xlApp.Workbooks.Open(filePath);
            Worksheet xlSheet = _xlBook.Sheets["Sheet1"];
            Range xlRange = xlSheet.Range["A1", "B4"];

            textBox1.Clear();
            for (int i = 1; i <= xlRange.Rows.Count; i++)
            {
                var line = new List<string>();
                for (int j = 1; j <= xlRange.Columns.Count; j++)
                {
                    Range range = xlRange.Cells[i, j];
                    line.Add(range.Value2);
                }
                textBox1.AppendText(string.Join(" | ", line));
                textBox1.AppendText(Environment.NewLine);
            }
        }
        else
        {
            _xlBook?.Close();
            _xlBook = null;
        }
    }
}

與工作簿交互

當我對此進行測試時,一切都在各種測試條件下正確處理。 看看能不能復現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM