C# Listview双击无法正常工作
我对这个清单有意见。当我双击它时,它应该会显示一个对话框,显示我所单击行的第一个单元格的信息,这非常好 现在的问题是,如果我一直单击行,我仍然会从前面单击的行中获得对话框C# Listview双击无法正常工作,c#,listview,C#,Listview,我对这个清单有意见。当我双击它时,它应该会显示一个对话框,显示我所单击行的第一个单元格的信息,这非常好 现在的问题是,如果我一直单击行,我仍然会从前面单击的行中获得对话框 I click a random row 1 time: Shows me dialog I click another random row: Shows me dialog from the first row I clicked, then when I close said dialog it shows me the
I click a random row 1 time: Shows me dialog
I click another random row: Shows me dialog from the first row I clicked, then when I close said dialog it shows me the dialog of info of the row I clicked.
I click another random row: Shows me dialog from the first row I clicked and from the second one.
。。它还在继续
代码如下:
private void listViewPlayers_MouseDoubleClick(object sender, MouseEventArgs e)
{
string
pUser = "";
int
pID = -1;
pID = Convert.ToInt32(listViewPlayers.SelectedItems[0].SubItems[0].Text);
pUser = listViewPlayers.SelectedItems[0].SubItems[1].Text;
bw.WorkerReportsProgress = true;
bw.DoWork += new DoWorkEventHandler
(
delegate(object o, DoWorkEventArgs args)
{
BackgroundWorker b = o as BackgroundWorker;
pInfo = pInfoClient.DownloadString("get info from web").Trim();
}
);
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler
(
delegate(object o, RunWorkerCompletedEventArgs args)
{
if (strcmp(pInfo, "ERROR"))
{
MessageBox.Show("There was an error retrieving user information!\nPlease try again later..", "Error");
return;
}
string[]
iSplit = pInfo.Split(new char[] { (char)'|' }, System.StringSplitOptions.RemoveEmptyEntries);
playerInfo iInfo = new playerInfo(pUser, pID, iSplit);
iInfo.ShowDialog();
}
);
bw.RunWorkerAsync();
}
请原谅我对这个问题的解释,我在这方面做得很糟糕。您可能遇到了意外的内存泄漏情况 看起来“bw”是一个类变量?如果是这样,您的单击事件会不断向后台工作人员的事件添加新的处理程序,但不会删除处理程序,因此每次鼠标单击事件触发时,它都会通知后台工作人员执行该操作,并且这些事件会触发您以前注册的所有处理程序 您可以尝试每次更新后台工作人员,这将解决问题,或者在DoWork事件中,您可能希望确保取消注册该代理。即
var inlineHandler = new DoWorkEventHandler ( delegate(object o, DoWorkEventArgs args)
{
BackgroundWorker b = o as BackgroundWorker;
pInfo = pInfoClient.DownloadString("get info from web").Trim();
bw.DoWork -= inlineHandler;
});
bw.DoWork += inlineHandler;
不过,我强烈建议您每次都给这位员工打电话。谢谢!我添加了
BackgroundWorker bw=newbackgroundworker()代码>事件内部。现在一切正常。