2013-05-05 68 views
0

我遇到了相當惱人的問題。從發件人獲取動態NumericUpDown的值c#

我有這些全局變量(保持名稱等)

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由用戶改變(通過點擊的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; 
       } 
      } 
     } 

但evertime我運行此我得到了同樣的問題.. 「不能從類型System.Windows.Forms.Button將對象轉換爲 型System.Windows.Forms.NumericUpDown」

如何ç我解決這個問題,並根據NumericUpDown中填入的新號碼更新記錄?我無法得到這個工作,我有一種感覺,它與發件人那不工作良好..

感謝您的所有幫助! Yenthe

回答

2

您已將事件處理程序buttonWijzig_Click分配給控制按鈕。
此控件未在上述代碼中的任何位置定義。 (順便說一句,你分配在相同的控制方法,每循環)

我想你想你的事件處理程序分配給在循環中創建的每個的NumericUpDown作爲

numeriekVak.Click += new EventHandler(buttonWijzig_Click); 

當然的事件現在處理接收發送者的說法,而不是一個按鈕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 + "€"; 

} 
+0

Woha這就是我想要的95%+!但是我怎麼能只觸發這個按鈕時點擊?事情是我想它更新時,正確的按鈕被點擊,但不是NumericUpDown。這將節省大量的更新(這是我的想法沒有嵌入?) 謝謝你已經史蒂夫!:) – Yenthe 2013-05-05 19:27:02

+0

所以你有一個按鈕命名(例如)保存,你想在按下此按鈕時更新所有NumericUpDown的限制? – Steve 2013-05-05 20:06:54

+0

事實上,我有八個按鈕和八個numericUpDowns,具有所有不同的值。 我希望它只更新與點擊按鈕匹配的相應NumericUpDown! – Yenthe 2013-05-06 09:43:18

0

問題是:由於您的事件是由按鈕觸發的,因此您無法將發件人轉換爲數字上傳。

我看到你只有一個button,它沒有在你的代碼中聲明。 我認爲它的形式是正確的?

您是否意味着將單擊事件多次添加到單個按鈕?

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

如果是第二個選項,則應該將click事件添加到每個數字上下文中。 在您的代碼中查看此行。

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

^的事情是,你不能使用button.Click既然你可以'發件人一個按鈕到一個NumericUpDown,史蒂夫在那裏解釋我! 所以這不會工作,很遺憾:( – Yenthe 2013-05-05 19:32:55

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