![](/img/trans.png)
[英]Visual C#, Value of datagridview cell that is on focus is not submitted when I hit the submit button
[英]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;
});
}
使用 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.