从动态NumericUpDown中获取值

本文关键字:获取 NumericUpDown 动态 | 更新日期: 2023-09-27 18:12:07

我遇到了一个很烦人的问题。

我有这些全局变量(为了保持名称等)

List<object> NumeriekVakken = new List<object>();
        List<decimal> bedragenLijst = new List<decimal>();
        List<string> namenlijstVanNumericFields = new List<string>();
        List<string> namenLijst = new List<string>();

之后,我有一个功能,使NumericUpDowns,根据数据库中的记录数量。函数看起来像这样:

private void InitializeComponentControlArrayKnoppenTextboxenEnLabels()
        {
    foreach (DataRow dr in blCategorie.getAlleCategorieenMetLimieten())
            {
        double limiet = (double) dr.Field<double>("maximumBedrag");
                NumericUpDown numeriekVak = new NumericUpDown();
                numeriekVak.Name = "numeriekvak" + i;
                numeriekVak.Width = 100;
                numeriekVak.Maximum = 30000;
                numeriekVak.Minimum = 0;
                numeriekVak.Increment = 10;
                numeriekVak.Value = Convert.ToDecimal(limiet);
                numeriekVak.Location = new Point(250, beginhoogte + verhogenMet);
                this.Controls.Add(numeriekVak);
        NumeriekVakken.Add(numeriekVak);
                bedragenLijst.Add(numeriekVak.Value);
                namenlijstVanNumericFields.Add(numeriekVak.Name);
                namenLijst.Add(categorie);
        //to make unique names for my Numerics etc.
        i++;
                counter++;
                //click event aanmaken
                button.Click += new EventHandler(buttonWijzig_Click);
            }
}

在结尾,我想在用户更改numericUpDown时更新记录(通过单击numericUpDown或更改数字)

private void buttonWijzig_Click(object sender, EventArgs e)
        {
            Button knop = (Button)sender;
            NumericUpDown numeriekvak = (NumericUpDown)sender;
            for (int i = 0; i < counter; i++)
            {
                if (knop.Name == "knop" + i)
                {
                    int id = i, maximumBedrag = 0;
                    if (namenlijstVanNumericFields[i] == "numeriekvak" + i)
                    {
                        // update limit
                        DBManager.LimietRow limiet = new DBManager.LimietDataTable().NewLimietRow();
                        maximumBedrag = Convert.ToInt32(numeriekvak.Value);
                        blLimiet.updateLimiet(id, maximumBedrag);
                    }
                    labelBevestigingLimiet.Text = "Limiet " + namenLijst[i].ToString() + " is succesvol gewijzigd naar " + maximumBedrag + "€";
                    //stopping of loop if right button is found.
                    break;
                }
            }
        }

但是每次我运行这个,我得到同样的问题。"无法将对象从System.Windows.Forms.Button类型转换为System.Windows.Forms.NumericUpDown "

我怎么能解决这个问题,并根据在NumericUpDown上填写的新数字更新记录?我不能让这个工作,我有一种感觉,这与发送器工作不好有关。

谢谢你的帮助!Yenthe

从动态NumericUpDown中获取值

您已将事件处理程序buttonWijzig_Click分配给控件按钮。
此控件在上面代码中的任何地方都没有定义。(顺便说一下,您在每个循环的同一个控件上分配方法)

我认为你想把你的事件处理程序分配给在循环中创建的每个NumericUpDown

numeriekVak.Click += new EventHandler(buttonWijzig_Click);

当然,事件处理程序现在在sender参数中接收NumericUpDown控件,而不是按钮,因此事件处理程序的代码应该相应地更改

private void buttonWijzig_Click(object sender, EventArgs e)
{
     NumericUpDown numeriekvak = (NumericUpDown)sender;
     int id = 0, maximumBedrag = 0;
     // The ID could be extracted from the control name starting at 11 position
     id = Convert.ToInt32(numeriekvak.Name.Substring(11));
     // update limit
     DBManager.LimietRow limiet = new DBManager.LimietDataTable().NewLimietRow();
     maximumBedrag = Convert.ToInt32(numeriekvak.Value);
     blLimiet.updateLimiet(id, maximumBedrag);
     // The control name is already available, no need to use the list to retrieve it
     labelBevestigingLimiet.Text = "Limiet " + numeriekVak.Name + " is succesvol gewijzigd naar " + maximumBedrag + "€";
}

然而,对于你所说的目的,让我说:

在结尾我想更新一个记录每当numericUpDown是由用户更改的(通过单击数字向下或更改数字)

最好使用ValueChanged事件,因为当用户手动更改值而不是使用上/下按钮时也会触发该事件。上面的代码也适用于ValueChanged事件

编辑根据你下面的评论,然后事件处理程序的分配回到按钮(没有代码来创建按钮,所以我假设你已经遵循了与你的NumericUpDown相同的命名约定),但不是使用列表来跟踪你的NumericUpDown,我会使用Dictionary<int, NumericUpDown>,其中整数是需要从按钮名称检索相应的NumericUpDown的id。

In声明更改

Dictionary<int, NumericUpDown> NumeriekVakken = new Dictionary<int, NumericUpDown> ();

在Initialization inside InitializeComponentControlArrayKnoppenTextboxenEnLabels change

namenlijstVanNumericFields.Add(i, numeriekVak);

在按钮点击代码

private void buttonWijzig_Click(object sender, EventArgs e)
{
     Button knop = sender as Button;
     int id = 0, maximumBedrag = 0;
     // The ID could be extracted from the control name starting at 4th position
     id = Convert.ToInt32(knop.Name.Substring(4));
     // The ID is the key to find the corresponding NUmericUpDown in the dictionary
     NumericUpDown numeriekvak = NumeriekVakken[id];
     // update limit
     DBManager.LimietRow limiet = new DBManager.LimietDataTable().NewLimietRow();
     maximumBedrag = Convert.ToInt32(numeriekvak.Value);
     blLimiet.updateLimiet(id, maximumBedrag);
     // The control name is already available, no need to use the list to retrieve it
     labelBevestigingLimiet.Text = "Limiet " + numeriekVak.Name + " is succesvol gewijzigd naar " + maximumBedrag + "€";
}

问题是:由于您的事件是由按钮触发的,因此您无法将发送者转换为数字up - down。

我看到你只有一个button,它没有在你的代码中声明。我假设它在表格中,对吧?

你的意思是在一个按钮上添加多次点击事件吗?

或者你的意思是添加事件to each NumericUpDown??

如果它是第二个选项,您应该为每个数字上下添加click事件。请参阅代码中的这一行。

//click event aanmaken
button.Click += new EventHandler(buttonWijzig_Click);
private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
    {
        if(e.RowIndex >= 0) {
            DataGridViewRow row = this.dataGridView1.Rows[e.RowIndex];
            iD_supplierNumericUpDown.Value = row.Cells["ID"].Selected(); // this is the problem
            nSupplierTextBox.Text = row.Cells["NSupplier"].Value.ToString();
            e_mailTextBox.Text = row.Cells["E_mailTextBox"].Value.ToString();
            phoneTextBox.Text = row.Cells["Phone"].Value.ToString();
        }