我有一些在运行时构建的按钮,我想为每个按钮分配一个标签。
我是这样做的
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()));
答案 0 :(得分:2)
这是因为您试图将Int16
转换为int
(又名Int32
)。
Int16
为short
,Int32
为int
,Int64
为long
。
尝试添加Int32
或提取Int16
:
拉出Int16
:
dtProducts = LoadProducts((Int16)(sender as Button).Tag);
或者输入Int32
:
btnCategorie.Tag = Int32.Parse(row["IDSubcategorie"].ToString());
您只需要上述其中一项,否则两者都会遇到与之前相同的问题。
我建议将Int32
/ int
用于所有内容,除非您特别需要Int16
- 在这个计算时代,您不会得到好处。