将标记分配给按钮并检索它

时间:2015-05-13 19:42:23

标签: c# visual-studio-2010

我有一些在运行时构建的按钮,我想为每个按钮分配一个标签。

我是这样做的

private void CreateCategory(DataTable dt)
{
     int top = 0;
     int left = 0;
     string color = "";

     foreach (DataRow row in dt.Rows)
     {
         //  MessageBox.Show(row["Denumire"].ToString());
         //       List<Button> buttons = new List<Button>(); 

         Button btnCategorie = new Button();                
         color = row["Culoare"].ToString();
         btnCategorie.Text = row["Denumire"].ToString();
         btnCategorie.BackColor = rbgToColor(color);
         btnCategorie.Top = 0 + top;
         btnCategorie.Left = 0 + left;
         btnCategorie.Width = 120;
         btnCategorie.Height = 120;
         btnCategorie.FlatStyle = FlatStyle.Popup;
         btnCategorie.Tag =  Int16.Parse(row["IDSubcategorie"].ToString());
         //   buttons.Add(newButton);                    
         tabCategorii.Controls.Add(btnCategorie);
         btnCategorie.Click += new System.EventHandler(this.btnCategorii_Click);
         left = left + 120;
         if (left % 600 == 0) 
         { 
              top = top + 120;
              left = 0;
         }
    }
}

现在我试图像这样检索它

DataTable dtProducts  = new DataTable();
dtProducts = LoadProducts((int)(sender as Button).Tag);         
CreateProducts( dtProducts, (sender as Button).BackColor, pnlProduse);

尝试转换时会抛出错误

Additional information: Specified cast is not valid.

我设法做到了,但它看起来像黑客,我不喜欢它,有没有更好的方法来检索我的标签值?

 dtProducts = LoadProducts(Int32.Parse((sender as Button).Tag.ToString()));

1 个答案:

答案 0 :(得分:2)

这是因为您试图将Int16转换为int(又名Int32)。

Int16shortInt32intInt64long

尝试添加Int32或提取Int16

拉出Int16

dtProducts = LoadProducts((Int16)(sender as Button).Tag);     

或者输入Int32

btnCategorie.Tag =  Int32.Parse(row["IDSubcategorie"].ToString());

您只需要上述其中一项,否则两者都会遇到与之前相同的问题。

我建议将Int32 / int用于所有内容,除非您特别需要Int16 - 在这个计算时代,您不会得到好处。