问题
basically... When the user accepts or rejects a friend request it is supposed to remove the user's name, accept and reject button but it only removes the user's name and reject button. I don't understand. Code:
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);
}
Picture: GUI
When any of the buttons are clicked: GUI
Why isn't it deleting the 'Accept' button?
回答1:
You are changing the collection during the loop. To solve the problem, you can call ToList
at the end of the criteria which you find controls, and loop over the result. This way, you are looping through a different list than the collection you want to change:
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();
}
来源:https://stackoverflow.com/questions/37953971/c-sharp-i-dont-understand-why-this-button-wont-delete