2016-06-21 124 views
-3

基本上......当用户接受或拒绝好友请求时,它应该删除用户的名称,接受和拒绝按钮,但它只会删除用户的名称和拒绝按钮。我不明白。代码:C#我不明白为什么这个按钮不会删除

 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

为什么没有删除 '接受' 按钮?

+2

你其实放置断点在代码和台阶的贯通,看看那里的预期失败..请做到这一点首先你可以不要期望我们根据您发布的所有代码对您进行代码审查。谢谢 – MethodMan

+2

“这是我的代码,修复它” – LaneL

+1

同意。我问自己的第一个问题是,“OP是否调试了他自己的代码?”您在ctrls枚举中接受按钮? – Amy

回答

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(); 
} 
+0

**关于OP的注意事项:**当你发布很多与数据库相关的代码时,很难找到问题,因为问题可能是因为任何部分而没有人可以简单地重现问题,如果你发布[mcve](http://stackoverflow.com/help/mcve),问题会得到更多的关注和更有效的帮助。格式良好的问题对未来的读者会更有用:) –

+1

修复细微问题的好处 – Steve

+0

谢谢Reze Aghaei,我花了几个小时试图修复它,我尝试了'ToList()',但它没有工作,但它现在工作:)谢谢很多人。 – richardj97

相关问题