C# 指以编程方式创建的按钮及其';s点击事件
对于android的单声道系统,我绝对是初学者 我使用以下代码段以编程方式创建了50个按钮:C# 指以编程方式创建的按钮及其';s点击事件,c#,android,button,xamarin.android,C#,Android,Button,Xamarin.android,对于android的单声道系统,我绝对是初学者 我使用以下代码段以编程方式创建了50个按钮: for(int i=0;i<50;i++) { //code to calculate x and y position btn=new Button(this); //btn.SetBackgroundColor(Android.Resource.Color.);
for(int i=0;i<50;i++)
{
//code to calculate x and y position
btn=new Button(this);
//btn.SetBackgroundColor(Android.Resource.Color.);
btn.SetTextSize(Android.Util.ComplexUnitType.Sp,8);
btn.Text="Scrip "+i+"\n"+"CMP "+i+"\n"+"%Chg "+i;
lp = new RelativeLayout.LayoutParams(new ViewGroup.MarginLayoutParams((width+30)/5, (height-10)/10));
btn.LayoutParameters=lp;
lp.SetMargins(leftMargin,topMargin, 0, 0);
main.AddView(btn);
}
String str="";
btn.Click += (sender, e) =>
{
str=btn.Text;
Toast.MakeText(this, "Selected="+str,ToastLength.Short).Show();
Console.WriteLine("Selected="+str);
};
for(int i=0;i
{
str=btn.Text;
Toast.MakeText(此“已选=“+str,ToastLength.Short).Show();
Console.WriteLine(“Selected=“+str”);
};
但是这个代码的一个大问题是在循环的末尾,btn
对象只引用了最后一个按钮
因此,如果按下除最后一个按钮以外的任何按钮,则不会触发按钮单击事件。
如何解决?
理想情况下,它应该返回单击按钮的文本
另外,参考下面的屏幕截图,默认的按钮样式在这里看起来不太好。所以我想把它改为精确的矩形,而不是圆角矩形(默认的)。
有什么想法吗
由于我是新手,我们将非常感谢您的帮助!!
编辑
由于您的帮助,我能够适当地创建和引用所有按钮
但如何将其样式设置为精确的矩形??
移动btn。单击+=(发件人,e)
订阅内部for循环
更好的方法是创建一个命名方法,而不是创建许多匿名方法。例如,单击按钮并订阅:
btn = new Button(this);
btn.Click = Button_Click;
在该方法中,您可以将sender对象强制转换为Button,并知道单击了哪个按钮
更新:这里是完整的代码
const int rowsCount = 10;
const int columnsCount = 5;
int buttonsCount = rowsCount * columnsCount;
for (int i = 0; i < buttonsCount; i++)
AddButton();
移动btn。单击+=(发件人,e)
订阅内部for循环
更好的方法是创建一个命名方法,而不是创建许多匿名方法。例如,单击按钮并订阅:
btn = new Button(this);
btn.Click = Button_Click;
在该方法中,您可以将sender对象强制转换为Button,并知道单击了哪个按钮
更新:这里是完整的代码
const int rowsCount = 10;
const int columnsCount = 5;
int buttonsCount = rowsCount * columnsCount;
for (int i = 0; i < buttonsCount; i++)
AddButton();
这是因为您正在为for循环外部设置按钮单击事件。将其放在内部,以便将其分配给每个按钮,而不仅仅是最后一个按钮。这是因为您正在为for循环外部设置按钮单击事件。将其放在内部,以便将其分配给每个按钮,而不仅仅是最后一个按钮。n一个按钮,并每次创建一个新的按钮实例,但您的单击事件只添加一次(它在for循环之外)。因此,它将只添加到放入btn的最后一个按钮实例(for循环中的最后一个按钮)
您需要单独创建每个按钮(比如将它们放在一个列表中),然后在for循环之外,您将有一个对每个按钮的引用,您可以将单击事件单独添加到每个按钮。或者(更好的方法)在for循环中添加click事件,使您创建的每个按钮都与之保持一致。请记住,由于任意按钮(50个按钮中的一个)都会到达该事件,因此最好使用sender参数来确定其文本值。
i、 e:
for循环对按钮进行操作,并每次创建一个新的按钮实例,但您的click事件只添加一次(它在for循环之外)。因此,它将只添加到放入btn的按钮的最后一个实例(for循环中的最后一个按钮)
您需要单独创建每个按钮(比如将它们放在一个列表中),然后在for循环之外,您将有一个对每个按钮的引用,您可以将单击事件单独添加到每个按钮。或者(更好的方法)在for循环中添加click事件,使您创建的每个按钮都与之保持一致。请记住,由于任意按钮(50个按钮中的一个)都会到达该事件,因此最好使用sender参数来确定其文本值。
i、 e:
您已经创建了50个按钮,因此需要有50个对它的引用。实现这一点的最简单方法是创建一个按钮数组,如下所示:
Button[] btns = new Button[50];
for(int i=0;i<50;i++)
{
{
//code to calculate x and y position
btns[i]=new Button(this);
//btn.SetBackgroundColor(Android.Resource.Color.);
btns[i].SetTextSize(Android.Util.ComplexUnitType.Sp,8);
btns[i].Text="Scrip "+i+"\n"+"CMP "+i+"\n"+"%Chg "+i;
lp = new RelativeLayout.LayoutParams(new ViewGroup.MarginLayoutParams((width+30)/5, (height-10)/10));
btns[i].LayoutParameters=lp;
lp.SetMargins(leftMargin,topMargin, 0, 0);
main.AddView(btn);
}
btns[i].Click += (sender, e) =>
{
String str= ( (sender as Button) != null) ? (sender as Button).Content.ToString() : "";
Toast.MakeText(this, "Selected="+str,ToastLength.Short).Show();
Console.WriteLine("Selected="+str);
}
}
Button[]btns=新按钮[50];
对于(int i=0;i
{
字符串str=((发件人作为按钮)!=null)?(发件人作为按钮)。Content.ToString():“”;
Toast.MakeText(此“已选=“+str,ToastLength.Short).Show();
Console.WriteLine(“Selected=“+str”);
}
}
//编辑:您还需要为已创建50个按钮的每个按钮创建一个eventhandler,因此您需要有50个对它的引用。实现这一点的最简单方法是创建一个按钮数组,如下所示:
Button[] btns = new Button[50];
for(int i=0;i<50;i++)
{
{
//code to calculate x and y position
btns[i]=new Button(this);
//btn.SetBackgroundColor(Android.Resource.Color.);
btns[i].SetTextSize(Android.Util.ComplexUnitType.Sp,8);
btns[i].Text="Scrip "+i+"\n"+"CMP "+i+"\n"+"%Chg "+i;
lp = new RelativeLayout.LayoutParams(new ViewGroup.MarginLayoutParams((width+30)/5, (height-10)/10));
btns[i].LayoutParameters=lp;
lp.SetMargins(leftMargin,topMargin, 0, 0);
main.AddView(btn);
}
btns[i].Click += (sender, e) =>
{
String str= ( (sender as Button) != null) ? (sender as Button).Content.ToString() : "";
Toast.MakeText(this, "Selected="+str,ToastLength.Short).Show();
Console.WriteLine("Selected="+str);
}
}
Button[]btns=新按钮[50];
对于(int i=0;i
{
字符串str=((发件人作为按钮)!=null)?(发件人作为按钮)。Content.ToString():“”;
Toast.MakeText(此“已选=“+str,ToastLength.Short).Show();
Console.WriteLine(“Selected=“+str”);
}
}
//编辑:您还需要为每个按钮创建一个事件处理程序他可以通过在事件处理程序中强制转换(发件人作为按钮)来获取对按钮的引用。因此,不需要按钮数组。String str=((发件人作为按钮)!=null)?(发件人作为按钮)。Content.ToString():“”;
给了我以下错误:Android.Widget.Button不包含“Content”的定义,并且找不到接受类型为Android.Widget.Button的第一个参数的扩展方法“Content”
…同意@lazyberezovsky不需要按钮数组他可以通过强制转换(发送方为按钮)获得对按钮的引用在事件处理程序中。因此,不需要按钮数组。String str=((发件人作为按钮)!=null)?(发件人作为按钮)。Content.ToString():“”;
给了我以下错误:Android.Widget.Button不包含“Content”的定义,并且找不到接受类型为Android.Widget.Button的第一个参数的扩展方法“Content”
…同意@lazyberezovsky不需要按钮数组nx。但是你能给我提供sni吗