2016-06-21 54 views
1

我很努力地创建此脚本,它生成好友请求。我需要为每个按钮和标签特别添加一个ID,以便在用户单击接受或拒绝按钮时将其删除。c#如何创建按钮并稍后通过ID删除它

Button reqAccept; 
Button reqReject; 
Label reqUserName; 

private void loadFriendRequests() 
{ 
    using (SqlConnection connection = new SqlConnection(con)) 
    { 
     using (SqlCommand cmd = new SqlCommand("Select UserFirstName, UserLastName, FriendEmail From PendingRequests Where FriendEmail = @fe", connection)) 
     { 
      connection.Open(); 
      cmd.Parameters.AddWithValue("@fe", Properties.Settings.Default.Email); 
      using (SqlDataReader dr = cmd.ExecuteReader()) 
      { 
       i = 0; 
       while (dr.Read()) 
       { 
        i++; 
        foreach (object request in i.ToString()) 
        { 
         Label userName = new Label(); 
         Button accept = new Button(); 
         Button reject = new Button(); 

         accept.Click += Accept_Click; 
         reject.Click += Reject_Click; 

         userName.Text = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(dr["UserFirstName"].ToString() + " " + dr["UserLastName"].ToString()); 

         accept.Text = "Accept"; 
         reject.Text = "Reject"; 

         friendRequestPanel.Controls.Add(userName); 
         friendRequestPanel.Controls.Add(accept); 
         friendRequestPanel.Controls.Add(reject); 

         reqAccept = accept; 
         reqReject = reject; 
         reqUserName = userName; 
        } 
       } 
      } 
     } 
    } 
    Requests.Start(); 
} 
private void Reject_Click(object sender, EventArgs e) 
{ 
    friendRequestPanel.Controls.Remove(reqUserName); 
    friendRequestPanel.Controls.Remove(reqAccept); 
    friendRequestPanel.Controls.Remove(reqReject); 

    updateFriendRequestDatabase(2); 
} 
private void Accept_Click(object sender, EventArgs e) 
{ 
    friendRequestPanel.Controls.Remove(reqUserName); 
    friendRequestPanel.Controls.Remove(reqAccept); 
    friendRequestPanel.Controls.Remove(reqReject); 

    updateFriendRequestDatabase(1); 
} 

什么代码是这样做的: 上面的代码是选择是一样的用户的电子邮件,并为每一个朋友的要求有使用标签和2,将其添加到“FlowLayourPanel的要求按钮来接受或拒绝。

这是GUI的样子:GUI

当用户点击一个按钮,它显然会去的事件处理程序,但我怎么确定哪个按钮被按下?

它必须是这样的:

friendRequestPanel.Controls.Remove(reqUserName##ID##); 
+3

你可以得到该事件处理程序中的按钮为: 'Button buttonClicked = sender as Button'' –

+1

使用按钮的Tag属性。你可以用一些识别值来设置它(例如你的SQL查询检索到的一个ID)然后在按钮单击事件中,在将发件人参数强制转换为按钮后,读回该属性 – Steve

+0

我还会提出一件事。 您应该扩展按钮类。并使用另一个字段说“ID”。然后,当您将按钮放置在表单上时,将相关值分配给该字段。在此之后,当您在点击事件中取回按钮时,您可以获得该值。这是否有道理,让我知道,我会发布整个解决方案。 –

回答

4

要做的第一件事情就是从您的查询检索唯一标识您的数据的价值。假设你PendingRequest表有一个IDRequest那么你的查询可以改为

using (SqlCommand cmd = new SqlCommand(@"Select IDRequest, UserFirstName, 
         UserLastName, FriendEmail 
         From PendingRequests 
         Where FriendEmail = @fe", connection)) 

现在,当你动态创建控件,你还可以添加该ID来通过记录创建的每个控件的Tag属性

foreach (object request in i.ToString()) 
{ 
    Label userName = new Label(); 
    Button accept = new Button(); 
    Button reject = new Button(); 

    int idRequest = Convert.ToInt32(dr["IDRequest"]); 
    userName.Tag = idRequest; 
    accept.Tag = idRequest; 
    reject.Tag = idRequest; 
    .... 

最后在点击事件你使用这样

private void Reject_Click(object sender, EventArgs e) 
{ 
    Button c = sender as Button; 
    int idRequest = Convert.ToInt32(c.Tag); 
    var ctrls = friendRequestPanel.Controls 
            .Cast<Control>() 
            .Where(x => x.Tag != null && 
             Convert.ToInt32(x.Tag) == idRequest) 
            .ToList(); 
    foreach(Control ct in ctrls) 
    { 
      friendRequestPanel.Controls.Remove(ct); 
      ct.Dispose(); 
    } 
    updateFriendRequestDatabase(2); 
} 

通知代码可以检索按钮的具体实例和标签,如果你再从Controls集合移动控件,您不应该忘记将其丢弃。

+0

感谢您的回复!我得到这个错误:http://oi68.tinypic.com/dbjy2s.jpg – richardj97

+0

修复它,.Cast 应该是一种方法 – richardj97

+0

伟大的作品,但它并没有删除'接受'按钮..它删除了'拒绝'按钮和用户名称...? – richardj97

1

@Steve回答得很好。他已经向您展示了如何修复当前的代码。

我想建议你一个更好的方式来构建你的当前代码,以便它看起来更干净,并且你可以更好地控制好友请求功能。如果您有兴趣,请进一步阅读。如果你在紧迫的期限内,那么忽略:)。

如果我在您的位置,我会创建一个用户控件来表示个人好友请求,并在接受/拒绝时使用事件通知主窗体,以便它可以从面板/列表中删除请求。通过这种方式,主表单代码(设计器+后面的代码)将变得更清晰,可以阅读和理解。

FriendRequestControl

这将是标准UserControl其中有包含1 Label(用于显示朋友的姓名和2 Buttons接受和拒绝。

public partial class FriendRequestControl : UserControl 
{ 
    public event EventHandler Accepted; 
    public event EventHandler Rejected; 

    public FriendRequestControl() 
    { 
     InitializeComponent(); 
    } 

    public int RequestId { get; set; } 
    public string FriendName { set { lblFriend.Text = value; } } // TODO add empty/null checks on value 

    private void Accept_Click(object sender, EventArgs e) 
    { 
     UpdateRequest(1); 
     OnAccepted(); 
    } 

    private void Reject_Click(object sender, EventArgs e) 
    { 
     UpdateRequest(2); 
     OnRejected(); 
    } 

    private bool UpdateRequest(int flag) 
    { 
     // Update db using RequestId and flag 
     // TODO Return True/False based if update succeeds 
     return true; 
    } 

    private void OnAccepted() 
    { 
     var acceptedHandler = Accepted; 
     if (acceptedHandler != null) 
     { 
      acceptedHandler(this, EventArgs.Empty); 
     } 
    } 

    private void OnRejected() 
    { 
     var rejectedHandler = Rejected; 
     if (rejectedHandler != null) 
     { 
      rejectedHandler(this, EventArgs.Empty); 
     } 
    } 
} 

主要形式

private void Form1_Load(object sender, EventArgs e) 
{ 
    // Showing just 1 request here 
    var friendRequest = new FriendRequestControl 
    { 
     RequestId = 100, // As Steve mentioned, you db must return this. 
     FriendName = "Friend 1" 
    }; 

    friendRequest.Accepted += FriendRequest_Accepted; 
    friendRequest.Rejected += FriendRequest_Rejected; 

    flowLayoutPanel1.Controls.Add(friendRequest); 
} 

private void FriendRequest_Rejected(object sender, EventArgs e) 
{ 
    var friendRequest = sender as FriendRequestControl; 
    flowLayoutPanel1.Controls.Remove(friendRequest); 
} 

private void FriendRequest_Accepted(object sender, EventArgs e) 
{ 
    var friendRequest = sender as FriendRequestControl; 
    flowLayoutPanel1.Controls.Remove(friendRequest); 
} 
相关问题