簡體   English   中英

如何獲取動態添加到Windows窗體c#中的控件的值?

[英]How to obtain the value of a control added dynamically into Windows Form c#?

我讀了一些文章並且沒有管理解決了我的問題,我的問題是在我嘗試獲取動態添加到Windows窗體中的控件(CheckBox和ComboBox)的值時,我需要知道何時選中CheckBox(或取消選中) )當按下按鈕時,如果ComboBox為空(或不是),則此按鈕調用一種方法,在該方法中我驗證所有組件是否為空,我按以下方式添加控件:

 CheckBox box;
 ComboBox cmBox;
 for (int i = 1; i <= sumOfRegisters; i++)
 {
    box = new CheckBox();
    box.Name = "CheckBox" + i;
    box.Text = "Some text";
    box.AutoSize = true;
    box.Location = new Point(10, i * 25); //vertical

    cmBox = new ComboBox();
    cmBox.Name = "ComboBox" + i;
    cmBox.Size = new System.Drawing.Size(302, 21);
    cmBox.TabIndex = i;
    cmBox.Text = "Some Text";
    cmBox.Location = new Point(270, i * 25);

    this.groupBox.Controls.Add(cmBox);
    this.groupBox.Controls.Add(box);
}

“我在ComboBox的情況下添加數據庫中的值,我省略了這一部分。”

我嘗試用foreach獲取值:

foreach (Control ctrl in groupBox.Controls)

問題是我不知道如何檢查Control(CheckBox和ComboBox)是否被檢查或為空(視情況而定)。

非常感謝您的幫助,感謝您的時間。

將它添加到grbMateias后,您將丟棄對每個動態分配的控件的引用。

一種選擇當然是存儲這些引用,例如在List<Control>

List<ComboBox> comboBoxes = new List<ComboBox>();

for (int i = 1; i <= sumOfRegisters; i++)
{
    box = new CheckBox();
    comboBoxes.Add(box);
    // etc.
}

但是,您可以只迭代grbMateias中的控件

 foreach(Control ctl in grbMateias.Controls)
 {
     if (ctl is CheckBox)
     {
         // Use the checkbox
     }    
     else if (ctl is ComboBox)
     {
         // Use the ComboBox
     }    
 }

或使用Linq

var comboBoxes = grbMateias.Controls.OfType<ComboBox>();
var checkBoxes = grbMateias.Controls.OfType<CheckBox>();

您可以使用as運算符,如下所示:

foreach (Control ctrl in groupBox.Controls)
{
    CheckBox checkBox = ctrl as CheckBox;
    ComboBox comboBox = ctrl as ComboBox;

    if (checkBox != null)   // Control is a CheckBox
    {
        if (checkBox.Checked)
        {
            // CheckBox is checked
        }
        else
        {
            // CheckBox is not checked
        }
    } 
    else if (comboBox != null)  // Control is a ComboBox
    {
        if (comboBox.Items.Count == 0)
        {
            // ComboBox is empty
        } 
        else
        {
            // ComboBox isn't empty
        }
    }
}

由於您在循環中為每個控件賦予一個名稱,因此只要名稱是唯一的,就可以很容易地使用它來識別每個控件。 例如,要獲取第三個復選框,您可以使用以下內容:

Control control = groupBox.Controls.Single(x => x.Name == "CheckBox3");
Checkbox thirdCheckBox = (CheckBox)control;
bool checkBoxCheched = thirdCheckBox.Checked;

首先,你需要知道迭代時你正在使用什么控件,然后你可以轉換它並使用特定控件的方法。

foreach(Control c in groupBox.Controls)
{
    if(c is ComboBox)
    {
         if((ComboBox) c).SelectedItem == null)
            //handle nothing entered
    }
    else if(c is CheckBox)
    {
        if((CheckBox) c).Checked)
            //handle checked
    }
}

在上面的snippit中,我們使用is關鍵字檢查它是什么類型的Control。 然后,如果它是我們知道如何處理的控件,我們將其轉換並檢查是否為空或已檢查。

我需要知道何時檢查(或取消選中)CheckBox以及ComboBox是否為空(或不是)。

要獲取復選框和組合框的狀態,包括用於創建它們的索引,可以執行以下操作:

var checkBoxStates = groupBox.Controls
    .OfType<CheckBox>
    .Where(x => x.Name.StartsWith("CheckBox"))
    .Select(x => new {
        Index = Int.Parse(x.Name.Substring("CheckBox".Length)), 
        IsChecked = x.Checked
    })
    .ToList();

var comboBoxStates = groupBox.Controls
    .OfType<ComboBox>
    .Where(x => x.Name.StartsWith("ComboBox"))
    .Select(x => new {
        Index = Int.Parse(x.Name.Substring("ComboBox".Length)), 
        IsEmpty = x.Items.Count == 0
    })
    .ToList();

暫無
暫無

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

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