从动态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
您已将事件处理程序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();
}