我遇到了一个非常讨厌的问题。
我有这些全局变量(用于保存名称等)
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
答案 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();
}