2013-10-16 114 views
0

我有这个listivew的问题。当我双击它时,它应该会显示我单击的行的第一个单元格的信息对话框,并且工作得很好。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 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(); 
    } 

而且原谅我这个问题的解释,我在这可怕的。

回答

1

您可能有无意的内存泄漏情况。

它看起来像“bw”是一个类变量?如果是这样,你的点击事件不断地向后台工作人员的事件中添加新的处理程序,但不会删除处理程序,所以每次点击鼠标事件触发后,它都会告知后台工作人员执行此操作,并且这些事件触发了所有以前的处理程序已经注册过。

您可以尝试每次新建后台工作人员,这可以解决问题,或者在DoWork事件中您可能需要确保取消注册代理人。 I.E.

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; 

我强烈建议每次都新建工人。

+0

谢谢!我在事件中添加了'BackgroundWorker bw = new BackgroundWorker();'。现在工作正常。 – user1667191