0

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

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

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 上填写的新数字更新记录?我无法正常工作,我感觉这与发件人的工作不正常有关..

感谢所有的帮助!延特

4

3 回答 3

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 时更新记录(通过单击 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 + "€";

}
于 2013-05-05T18:42:42.670 回答
0

问题是:由于您的事件是由按钮触发的,因此您无法将发件人转换为数字上下。

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

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

还是您的意思是添加事件to eachNumericUpDown ???

如果是第二个选项,您应该将点击事件添加到每个数字 updown。在您的代码中查看这一行。

//click event aanmaken
button.Click += new EventHandler(buttonWijzig_Click);
于 2013-05-05T18:42:22.377 回答
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();
        }
于 2016-02-25T19:39:46.693 回答