0

このリストビューに問題があります。ダブルクリックすると、クリックした行の最初のセルの情報のダイアログが表示され、それは完全に正常に機能します。

問題は、行をクリックし続けると、クリックした前の行からダイアログが表示されることです。

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

そして、問題の説明を許してください、私はそれがひどいです。

4

1 に答える 1

1

不注意によるメモリ リークが発生する可能性があります。

「bw」はクラス変数のようですか?その場合、クリック イベントは常に新しいハンドラーをバックグラウンド ワーカーのイベントに追加していますが、ハンドラーを削除することはありません。そのため、マウス クリック イベントが発生するたびに、バックグラウンド ワーカーにそれを実行するように指示し、それらのイベントは以前のすべてのハンドラーに対してトリガーされます。登録したことがあります。

毎回バックグラウンドワーカーを新しくすることで問題が解決するか、DoWork イベントでデリゲートの登録を確実に解除することができます。IE

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;

ただし、毎回ワーカーを新しくすることを強くお勧めします。

于 2013-10-16T19:54:57.217 に答える