我有一個帶有串列框的對話框視窗,其中包含 >3000 個專案,初始加載需要很長時間。為了加載這個對話框,我創建了一個實體var dlg = new frmDlg();,然后當我需要這個對話框時,我打開它dlg.ShowDialog(this);雖然這減少了串列框需要初始化的時間,但在對話框卸載時顯示表單仍然需要很長時間對話框關閉后從記憶體中讀取,需要重新加載視覺元素。有什么辦法可以防止這種情況發生嗎?對于普通表單,我只會隱藏視窗而不是關閉它,但這似乎不適用于對話框視窗。
uj5u.com熱心網友回復:
將以下成員添加到frmDlg:
private bool keepHandle;
protected override void OnFormClosing(FormClosingEventArgs e)
{
keepHandle = e.CloseReason == CloseReason.UserClosing;
base.OnFormClosing(e);
}
protected override void DestroyHandle()
{
if (!keepHandle)
base.DestroyHandle();
}
這應該可以防止對話框的句柄在用戶關閉對話框時被破壞。
uj5u.com熱心網友回復:
表格1:
public partial class Form1 : Form
{
private Form2 reusable = null;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
if (reusable == null) reusable = new Form2();
reusable.ShowDialog(this);
switch (reusable.DialogResult)
{
case DialogResult.OK: MessageBox.Show("Ok clicked."); break;
case DialogResult.Cancel: MessageBox.Show("Cancel clicked."); break;
case DialogResult.None: MessageBox.Show("Form Closed."); break;
}
}
}
表格2:
public partial class Form2 : Form
{
private DialogResult dialogResult = DialogResult.None;
public new DialogResult DialogResult
{
get => this.dialogResult;
set => this.dialogResult = value;
}
public Form2()
{
InitializeComponent();
}
private void Form2_Shown(object sender, EventArgs e)
{
this.dialogResult = DialogResult.None;
}
private void Form2_FormClosing(object sender, FormClosingEventArgs e)
{
e.Cancel = true;
this.Hide();
}
private void button1_Click(object sender, EventArgs e)
{
this.dialogResult = DialogResult.OK;
this.Close();
}
private void button2_Click(object sender, EventArgs e)
{
this.dialogResult = DialogResult.Cancel;
this.Close();
}
}
^ 幾個警告:你不能再使用 ShowDialog 結果的結果,你需要創建你自己的 DialogResult 屬性,或者只是使用一個完全不同的/新的屬性來表示你的對話框是如何隱藏的。
您也不能再在任何按鈕上使用 Button.DialogResult 屬性,您需要實作自己的按鈕單擊事件來處理設定對話框結果。
這完全是因為當您呼叫 ShowDialog 結果時 .net 框架中發生的事情。
此外,德米特里關于使用 e.CloseReason 的例子也是有效的 - 您可能希望允許關閉應用程式關閉之類的東西。這樣,您還可以處理 FormClosed 事件并在應用程式關閉之前執行您需要執行的任何快速清理。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/377588.html
上一篇:如果列索引0包含特定字串C#,如何隱藏整個DataGridview行
下一篇:記錄員工進出
