【问题标题】:C# I don't understand why this button won't deleteC#我不明白为什么这个按钮不会删除
【发布时间】:2016-06-21 20:27:25
【问题描述】:

基本上...当用户接受或拒绝好友请求时,它应该删除用户的姓名、接受和拒绝按钮,但它只删除用户的姓名和拒绝按钮。我不明白。代码:

        private void loadFriendRequests()
    {
        using (SqlConnection connection = new SqlConnection(con))
        {
            using (SqlCommand cmd = new SqlCommand(@"Select IDRequest, UserFirstName, UserLastName, FriendEmail From PendingRequests Where FriendEmail = @fe", connection))
            {
                connection.Open();
                cmd.Parameters.AddWithValue("@fe", Properties.Settings.Default.Email);
                using (SqlDataReader dr = cmd.ExecuteReader())
                {
                    int 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.Text = "Accept";
                            reject.Text = "Reject";
                            int idRequest = Convert.ToInt32(dr["IDRequest"]);
                            userName.Text = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(dr["UserFirstName"].ToString() + " " + dr["UserLastName"].ToString());
                            userName.Tag = idRequest;
                            accept.Tag = idRequest;
                            reject.Tag = idRequest;

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

                            friendRequestPanel.Controls.Add(userName);
                            friendRequestPanel.Controls.Add(accept);
                            friendRequestPanel.Controls.Add(reject);
                        }
                    }
                }
            }
        }
        Requests.Start();
    }
    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 => 
                                             Convert.ToInt32(x.Tag) == idRequest);
        foreach (Control ct in ctrls)
        {
            friendRequestPanel.Controls.Remove(ct);
            ct.Dispose();
        }
        updateFriendRequestDatabase(2);
    }
    private void Accept_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);
        foreach (Control ct in ctrls)
        {
            friendRequestPanel.Controls.Remove(ct);
            ct.Dispose();
        }
        updateFriendRequestDatabase(1);

    }

图片:GUI

点击任意按钮时:GUI

为什么不删除“接受”按钮?

【问题讨论】:

  • 您是否真的在代码中放置了断点并逐步查看预期失败的地方。请先这样做,您不能指望我们根据您的所有代码为您进行代码审查已经发布了..谢谢你
  • “这是我的代码,修复它”
  • 同意。我问自己的第一个问题是,“OP 是否调试了他自己的代码?” ctrls 枚举中有你的接受按钮吗?
  • 就像说I don't understand why I didn't win the Lottery win you never purchased a ticket in the first place..
  • 第一个功能后接受按钮的标签是什么?也许它是空的?

标签: c# winforms flowlayout


【解决方案1】:

您正在循环期间更改集合。要解决此问题,您可以在找到控件的条件末尾调用ToList,然后循环遍历结果。这样,您将循环访问与要更改的集合不同的列表:

var ctrls = friendRequestPanel.Controls.Cast<Control>()
                              .Where(Convert.ToInt32(x.Tag) == idRequest)
                              .ToList();  //<--- Creates a new List<Control>
foreach (Control ct in ctrls)
{
    friendRequestPanel.Controls.Remove(ct);
    ct.Dispose();
}

【讨论】:

  • OP注意事项: 当你贴出很多和数据库相关的代码时,真的很难找到问题所在,因为问题可能是由于任何部分没有人可以简单地重现这个问题。如果您发布mcve,该问题将得到更多关注和更有效的帮助。一个格式良好的问题对未来的读者也会更有用:)
  • 谢谢 Reze Aghaei,我花了几个小时试图修复它,我确实尝试了 'ToList()' 但它没有用,但它现在可以工作了 :) 非常感谢。
猜你喜欢
  • 1970-01-01
  • 2016-01-24
  • 2020-03-28
  • 2016-02-03
  • 2013-07-23
  • 1970-01-01
  • 1970-01-01
  • 2014-11-09
  • 2012-12-10
相关资源
最近更新 更多