我正在開發 C# 控制臺/winforms 桌面應用程式。它監視一些本地驅動器屬性并通過任務計劃程式按用戶定義的計劃顯示狀態訊息。用戶可以保存多個時間表。以下是選擇/激活特定保存的時間表所采取的操作(螢屏截圖大小為 50% 并合并為單個圖形):
- 截圖A:點擊“Change Active”按鈕呼叫子表單
- 螢屏截圖 B:從 Combobox 中選擇一個計劃,然后單擊 Activate Selected Schedule 關閉子表單,傳遞選定的計劃進行處理。
- 螢屏截圖 C – 使用 Close() 方法的結果:日程定義螢屏填充有所選日程的詳細資訊,包括(如果需要)呼叫不同的子表單,但在父表單開始處理填充之前,選擇的活動日程表單實際上并未關閉資料; Child1 僅在通過單擊保存或取消關閉 Child2 后關閉。
- 螢屏截圖 D – 使用 Hide() 方法的結果:按預期作業

相關代碼(我認為)
public interface IselectSchedule
{
void SelectSchedule(string sName);
}
/// Parent form
public partial class DefineSched : Form, IDates, IDoWs, IselectSchedule
{
/// calling Child1
private void ChangeActvLBLasBTN_Click(Object sender, EventArgs e)
{
SetActvSchedule callSetActvSched = new SetActvSchedule(this);
callSetActvSched.StartPosition = FormStartPosition.Manual;
callSetActvSched.Location = new Point(this.Left 45, this.Top 25);
callSetActvSched.ShowDialog();
}
}
/// Child1 form
public partial class SetActvSchedule : Form
{
IselectSchedule _callingForm;
public SetActvSchedule(IselectSchedule caller)
{
InitializeComponent();
_callingForm = caller;
}
/// form content
private void SaveBTN_Click(Object sender, EventArgs e)
{
this.Close(); // not achieving my objective but Hide does
_callingForm.SelectSchedule(_sname);
}
}
/// back in Parent form
public void SelectSchedule(string sName)
{
_sName = sName;
bool useDB = false;
SetActvDisplay(useDB);
EditSaved(useDB);
}
private void EditSaved(bool useDB)
{
/// populate parent form data & call Child2
SelectDoW callSelectDoWs = new SelectDoW(this, det, det2);
callSelectDoWs.StartPosition = FormStartPosition.CenterParent;
callSelectDoWs.ShowDialog(owner: this);
/// ready for editing
我已經研究/了解隱藏與關閉的決定,并認為關閉在這里是合適的。我的問題是因為 Close() 在回傳到父表單之前為什么沒有在父表單開始處理傳遞的資訊之前完成該操作?
提前感謝您的任何見解。
uj5u.com熱心網友回復:
雖然我相信我幾乎可以使用上面建議的多執行緒方法來作業,但我遇到了無法解決的跨執行緒錯誤。經過進一步考慮,我可能一直在尋求一種不必要的復雜解決方案來實作一個非常簡單的目標;向用戶提供一些選項并根據他們的選擇采取行動。
簡單的解決方案利用父表單中的公共靜態欄位,該欄位在子表單中設定,之后子表單被干凈地關閉并且控制回傳到父表單:
/// Parent form
public partial class DefineSched : Form
{
public static string _sName;
/// calling Child
private void ChangeActvBTN_Click(Object sender, EventArgs e)
{
SetActvSchedule callSetActvSched = new SetActvSchedule();
callSetActvSched.ShowDialog();
ActvSchedOptions();
}
}
/// Child1 form
public partial class SetActvSchedule : Form
{
private void SaveBTN_Click(Object sender, EventArgs e)
{
DefineSched._sName = _sname;
this.Close();
}
}
/// back in Parent form
ActvSchedOptions()
{
/// series of conditional statements
這種方法繞過了對介面的需求,并避免了 UI 執行緒的過載。我懷疑它不會被認為是一個特別優雅的解決方案,但它有一個可取之處:它可以完美地完成手頭的任務。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/341550.html
