C# 指以编程方式创建的按钮及其';s点击事件

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.);

对于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.);
                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吗