2016-06-21 12 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

関連する問題