簡體   English   中英

C#:如何以編程方式循環遍歷 Windows 表單上的所有控件

[英]C#: How can I programmatically loop through all controls on a Windows Form

我正在創建一個前端 Windows Forms 應用程序,它將有多種用途。 其中一種用途是允許最終用戶管理數據庫表的內容。

目前,我的表單包含一個使用 DataTable 作為其源的 DataGridView object。 該數據表由存儲過程填充,該存儲過程根據最終用戶指定的標准從表中選擇每一行。 我想將代碼放入 DataGridView 中,它將查看用戶選擇的行,並將使用該行的詳細信息填充一系列文本框。

我想避免為 DataGridView 中的每一列硬編碼一個文本框,因為將來我很有可能將列添加到底層存儲過程。 因此,我的計划是,當用戶第一次選擇一行時,應用程序將為每一列動態創建一個文本框,適當地調整該文本框的大小(高度和寬度)並添加適當的標簽。

到目前為止,我編寫的代碼創建了一個全新的 DataTable,並添加了列來存儲 DataGridView 中每一列的以下信息:

  1. DataGridView 列的實際名稱;
  2. 我希望給相關聯的 label 起的名稱;
  3. 我希望分配給相關 label 的文本;
  4. 關聯label的左上角位置;
  5. 我希望賦予相關文本框的名稱;
  6. 我希望在相關文本框中顯示的值;

到目前為止,當用戶最初單擊一行時,一切正常:文本框在垂直列中創建,關聯的 label 位於每個文本框的左側,並在每個文本框中顯示適當的值。 每個文本框的寬度都根據該文本框的內容動態設置,以便可以輕松查看所有內容。

當用戶從 DataGridView 的一行更改為另一行時,困難就來了。 運行以創建每個控件的代碼如下所示:

            if (pnlManageJobManagerOutcomes.Controls.Contains(txtCurrent))
            {

                pnlManageJobManagerOutcomes.Controls.Remove(txtCurrent);

            }
            if (!pnlManageJobManagerOutcomes.Controls.Contains(txtCurrent))
            {

                pnlManageJobManagerOutcomes.Controls.Add(txtCurrent);

            }

當代碼第一次運行時,一切似乎都很好。 但是,如果它被第二次觸發(此時它應該刪除並重新創建控件),它似乎不會檢測到控件的先前存在,並且只是在表單中創建它的第二個副本。

有關信息,我正在構建的表單有多種用途,由一系列按鈕決定。 因此,我在 Panel (pnlManageJobManagerOutcomes) 中為這個特定用途創建了控件。 我完全不明白為什么代碼在隨后的執行過程中沒有發現這些控件的存在。

TIA

我已經想出了一種方法來做到這一點,這可能看起來很笨重,但似乎很管用。

由於我似乎無法檢查我正在使用的面板是否包含字段名稱,因此我編寫了一個方法,該方法將遍歷該面板中的控件並返回實例數的計數面板的控件數組中的那個控件。 如果該方法返回 0,這意味着該面板中不存在控件,我可以提前 go 並創建它。

暫無
暫無

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

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