1

したがって、BindingListにバインドされているリストボックスGUI要素があります。私が遭遇する問題は、アイテムを追加するたびにBindingListに追加されると、リストボックス内の対応するアイテムが選択されることです。これは、リストボックスでSelectedIndexChangedイベントを発生させるため、大きな問題になります。これは、リソースをいくらか消費するように設定されています。

このデフォルトの動作を削除するにはどうすればよいですか?

編集:これが私が使用しているコードです

BindingList<KeyValuePair<int, string>> savedGLs;
public Form1()
{
    InitializeComponent();
    savedGLs = new BindingList<KeyValuePair<int, string>>();
    lstGLs.DataSource = savedGLs;//lstGLs is my listbox
    lstGLs.DisplayMember = "Value";
    lstGLs.ValueMember = "Key";
    populateMgmtCos();
    populateSavedGLs();//this is where the SelectedIndexChanged event is firing
}
private void populateSavedGLs()
{
    savedGLs.Clear();
    string errmsg = string.Empty;
    using (SqlConnection sqlConn = new SqlConnection(getConnString(true)))
    {
        string sCmd = " SELECT Name, Hmy FROM GLTable";
        DataTable dt = MySqlHelper.ExecuteForDataTable(sqlConn, sCmd, out errmsg);
        foreach (DataRow dr in dt.Rows)
            savedGLs.Add(new KeyValuePair<int,string>(int.Parse(dr["Hmy"].ToString()), dr["Name"].ToString().Trim()));
     }
}

EDIT2:3.5フレームワークを使用していることが原因でしょうか?問題を再現するためのコードを除いて、ほとんど何も含まれていない新しいプロジェクトを作成しました。BindingListのAdd()メソッドは、リストボックスでSelectedIndexChangedメソッドを呼び出しているようです。最初の項目が追加されたときに2回、その後は1回です。これは、その新しいプロジェクトの完全なコードです。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        BindingList<KeyValuePair<int, string>> bl;
        public Form1()
        {
            InitializeComponent();
            bl = new BindingList<KeyValuePair<int, string>>();
            listBox1.DataSource = bl;
            bl.Add(new KeyValuePair<int, string>(1, "blah1"));
            bl.Add(new KeyValuePair<int, string>(2, "blah2"));
            bl.Add(new KeyValuePair<int, string>(3, "blah3"));
            bl.Add(new KeyValuePair<int, string>(4, "blah4"));
            bl.Add(new KeyValuePair<int, string>(5, "blah5"));
        }

        private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            Console.WriteLine("blah");
        }
    }
}
output:
blah
blah
blah
blah
blah
blah
4

1 に答える 1

2

最後に、再現可能です。

コンストラクター中にこれらの項目を BindingList に追加しないでください。

簡単な修正は、フォームの OnLoad メソッドをオーバーライドすることです。

protected override void OnLoad(EventArgs e) {
  bl.Add(new KeyValuePair<int, string>(1, "blah1"));
  bl.Add(new KeyValuePair<int, string>(2, "blah2"));
  bl.Add(new KeyValuePair<int, string>(3, "blah3"));
  bl.Add(new KeyValuePair<int, string>(4, "blah4"));
  bl.Add(new KeyValuePair<int, string>(5, "blah5"));
  base.OnLoad(e);
}

または本番コードから:

public Form1()
{
  InitializeComponent();
  savedGLs = new BindingList<KeyValuePair<int, string>>();
  lstGLs.DisplayMember = "Value";
  lstGLs.ValueMember = "Key";
  lstGLs.DataSource = savedGLs;
}

protected override void OnLoad(EventArgs e) {
  populateMgmtCos();
  populateSavedGLs();
}
于 2012-07-25T18:38:50.880 に答える