C# 如何为每个动态按钮创建自己的事件

C# 如何为每个动态按钮创建自己的事件,c#,winforms,C#,Winforms,我正在为本地大学的学生创建一个Windows窗体应用程序,有一段时间我一直在解决一个问题。我正在处理的项目允许用户添加朋友或发送朋友请求,我已经创建了一个UI,显示用户的详细信息(注册所需的名字和姓氏*),向用户发送朋友请求。我通过一个循环创建UI,该循环基于数据库中表的记录数,其中登录用户的ID键位于第二列。我遇到的问题是,当我尝试允许用户从一个按钮接受好友请求时,该按钮与请求详细信息面板一起创建。到目前为止,我已经创建了3个面板,所有面板都包含3个名称,我试图根据从每个面板单击的按钮获取包含

我正在为本地大学的学生创建一个Windows窗体应用程序,有一段时间我一直在解决一个问题。我正在处理的项目允许用户添加朋友或发送朋友请求,我已经创建了一个UI,显示用户的详细信息(注册所需的名字和姓氏*),向用户发送朋友请求。我通过一个循环创建UI,该循环基于数据库中表的记录数,其中登录用户的ID键位于第二列。我遇到的问题是,当我尝试允许用户从一个按钮接受好友请求时,该按钮与请求详细信息面板一起创建。到目前为止,我已经创建了3个面板,所有面板都包含3个名称,我试图根据从每个面板单击的按钮获取包含用户详细信息的每个标签的名称,如上所述,但是如果我单击第一个面板的按钮,我只会显示最后一个面板的标签文本。任何帮助都将不胜感激

我用来创建面板的代码

            {
                
                Panel pnlFriend = new Panel();          
                int y = pnlFriend.Location.Y;
                pnlFriend.Width = 315;
                pnlFriend.Height = 56;
                y = 55;
                pnlFriend.Location = new Point(3, y);               
                pnlFriend.BorderStyle = BorderStyle.FixedSingle;

                Label lblfriendName = new Label();          
                lblfriendName.Location = new Point(3, 5);
                lblfriendName.Font = new Font("Arial", 10);
                lblfriendName.Text = names[nameCounter].ToString();

                Label pendingCap = new Label();
                pendingCap.Location = new Point(3, 28);
                pendingCap.Width = 123;
                pendingCap.Height = 13;
                pendingCap.Text = "has sent a friend request";

                Button accept = new Button();           
                accept.Width = 51;
                accept.Height = 23;
                accept.Location = new Point(157, 23);
                accept.Text = "Accept";
                accept.Click += new EventHandler(acceptFriendRequestService);

                Button decline = new Button();      
                decline.Width = 51;
                decline.Height = 23;
                decline.Location = new Point(214, 23);
                decline.Text = "Decline";
                decline.Click += new EventHandler(declineFriendRequestService);

                pnlFriend.Controls.Add(lblfriendName);
                pnlFriend.Controls.Add(pendingCap);
                pnlFriend.Controls.Add(accept);
                pnlFriend.Controls.Add(decline);
                flpFriendRequest.Controls.Add(pnlFriend);

                nameCounter++;          
            }
        

您可以使用按钮
Tag
保存数据,然后稍后检索数据

范例

按钮接受=新按钮();
接受。宽度=51;
接受。高度=23;
接受。位置=新点(157,23);
accept.Text=“accept”;
accept.Click+=neweventhandler(acceptFriendRequestService);
accept.Tag=names[nameCounter].ToString();
void acceptFriendRequestService(对象发送方,事件参数e){
var name=((按钮)sender).Tag;
//在这里做你的工作。
}

您可以在内联函数中使用所谓的闭包或变量捕获

按钮接受=新按钮();
接受。单击+=(发件人,参数)=>
{
//您可以在这里访问accept var
};

如果在循环中创建一组按钮,请确保不要使用成员变量,甚至不要使用循环外部的局部变量。您希望在循环中创建一个全新的按钮,以便lambda可以引用正确的变量。

这听起来您更希望使用DataGridView之类的数据绑定控件,这将允许您将一列按钮绑定到各个记录。不确定问题出在哪里。我们看不到您在这些事件处理程序方法中正在做什么,但您通常会检查发送方,看看调用方是谁。@请先详细说明。现在还不清楚问题出在哪里。@好的,我正在动态创建组件,它们都添加到面板中,作为父控件,现在每个面板包含2个按钮接受和拒绝。我的问题是,如果我点击第一个面板的按钮,我只会从最后一个面板中得到标签的文本。它起作用了。谢谢你的帮助。成功了。感激