通过Sender获取动态NumericUpDown的值c#

时间:2013-05-05 18:32:17

标签: c# dynamic sender numericupdown eventargs

我遇到了一个非常讨厌的问题。

我有这些全局变量(用于保存名称等)

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,具体取决于db中的记录数。 该函数如下所示:

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时更新记录(通过点击数字下注或更改数字)

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

3 个答案:

答案 0 :(得分:2)

您已将事件处理程序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。

声明变更

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

InitializeComponentControlArrayKnoppenTextboxenEnLabels更改

中的初始化中
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 + "€";

}

答案 1 :(得分:0)

问题是:由于您的事件被按钮触发,您无法将发件人转换为数字更新。

我看到你只有一个button而且你的代码中没有声明它。 我认为它是在形式,对吧???

  

您的意思是多次将该点击事件添加到一个按钮???

     

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

如果是第二个选项,则应将click事件添加到每个数字更新。 请在代码中查看此行。

//click event aanmaken
button.Click += new EventHandler(buttonWijzig_Click);

答案 2 :(得分:0)

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();
        }