0

背景: Sorted プロパティのみが異なる 2 つのコンボ ボックスがあります。omboBox1 の Sorted プロパティはtrueに設定され、comboBox2 の Sorted プロパティはfalseに設定されています。これら 2 つのコンボ ボックスのデータソース プロパティを再割り当て/リセットしようとすると、comboBox1 にはデータが表示されず、comboBox2 には表示されます。Sorted プロパティが原因で、comboBox1 のデータが正しく表示されないのはなぜですか?

以下に含まれるすべてのコード:

public partial class Form1 : Form
{
    private string[] a8BitGames = { "Metroid", "Zelda", "Phantasy Star", "SB:S&SEP" };
    private string[] a16BitGames = { "StarFox", "Link", "Final Fantasy", "Altered Beast" };
    private List<string> lSomeList = null;
    private List<string> lSomeOtherList = null;

    public Form1()
    {
        InitializeComponent();
        this.lSomeList = new List<string>(a8BitGames);
        this.lSomeOtherList = new List<string>(a16BitGames);
        this.comboBox1.DataSource = lSomeList;
        this.comboBox2.DataSource = lSomeOtherList;
    }

    private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        this.IndexChanged(1);
    }

    private void IndexChanged(int comboBox)
    {
        this.comboBox1.DataSource = null;
        this.comboBox1.DataSource = a16BitGames;

        this.comboBox2.DataSource = null;
        this.comboBox2.DataSource = a8BitGames;
    }

    private void comboBox2_SelectedIndexChanged(object sender, EventArgs e)
    {
        this.IndexChanged(2);
    }
}

partial class Form1
{
    /// <summary>
    /// Required designer variable.
    /// </summary>
    private System.ComponentModel.IContainer components = null;

    /// <summary>
    /// Clean up any resources being used.
    /// </summary>
    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
    protected override void Dispose(bool disposing)
    {
        if (disposing && (components != null))
        {
            components.Dispose();
        }
        base.Dispose(disposing);
    }

    #region Windows Form Designer generated code

    /// <summary>
    /// Required method for Designer support - do not modify
    /// the contents of this method with the code editor.
    /// </summary>
    private void InitializeComponent()
    {
        this.comboBox1 = new System.Windows.Forms.ComboBox();
        this.comboBox2 = new System.Windows.Forms.ComboBox();
        this.SuspendLayout();
        // 
        // comboBox1
        // 
        this.comboBox1.FormattingEnabled = true;
        this.comboBox1.Location = new System.Drawing.Point(13, 13);
        this.comboBox1.Name = "comboBox1";
        this.comboBox1.Size = new System.Drawing.Size(121, 21);
        this.comboBox1.Sorted = true;
        this.comboBox1.TabIndex = 0;
        this.comboBox1.SelectedIndexChanged += new System.EventHandler(this.comboBox1_SelectedIndexChanged);
        // 
        // comboBox2
        // 
        this.comboBox2.FormattingEnabled = true;
        this.comboBox2.Location = new System.Drawing.Point(13, 41);
        this.comboBox2.Name = "comboBox2";
        this.comboBox2.Size = new System.Drawing.Size(121, 21);
        this.comboBox2.TabIndex = 1;
        this.comboBox2.SelectedIndexChanged += new System.EventHandler(this.comboBox2_SelectedIndexChanged);
        // 
        // Form1
        // 
        this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
        this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
        this.ClientSize = new System.Drawing.Size(284, 262);
        this.Controls.Add(this.comboBox2);
        this.Controls.Add(this.comboBox1);
        this.Name = "Form1";
        this.Text = "Form1";
        this.ResumeLayout(false);

    }

    #endregion

    private System.Windows.Forms.ComboBox comboBox1;
    private System.Windows.Forms.ComboBox comboBox2;
}
4

3 に答える 3

1

問題は、並べ替えられたコンボボックスのデータ ソースを変更できないことです。ComboBox コントロールのコードの抜粋を次に示します。

        protected override void OnDataSourceChanged(EventArgs e)
    {
        if ((this.Sorted && (this.DataSource != null)) && base.Created)
        {
            this.DataSource = null;
            throw new InvalidOperationException(System.Windows.Forms.SR.GetString("ComboBoxDataSourceWithSort"));
        }
        ...
        ...
    }

このような場合、InvalidOperationException を受け取っているはずです。を受け取っていないのはなぜですか? 答えは次のとおりです。

ComboBox コントロールに DataSource プロパティを実装すると、その基本クラス (ListControl) 実装にリダイレクトされます。

        public object DataSource
    {
        get
        {
            return base.DataSource;
        }
        set
        {
            base.DataSource = value;
        }
    }

そして、基本クラスの DataSource で:

        public object DataSource
    {
        [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
        get
        {
            return this.dataSource;
        }
        set
        {
            if (((value != null) && !(value is IList)) && !(value is IListSource))
            {
                throw new ArgumentException(System.Windows.Forms.SR.GetString("BadDataSourceForComplexBinding"));
            }
            if (this.dataSource != value)
            {
                try
                {
                    this.SetDataConnection(value, this.displayMember, false);
                }
                catch
                {
                    this.DisplayMember = "";
                }
                if (value == null)
                {
                    this.DisplayMember = "";
                }
            }
        }
    }

サイレントキャッチブロックに注意してください。SetDataConnection は OnDataSourceChanged を呼び出すため、私の分析が正しい限り、これが理由です。私が間違っている場合は、私を修正してください。

于 2014-03-05T13:26:39.050 に答える
1

Try to sort by sorting the list on setting the DataSource

 public List<string> A16Games
 {
    get { return this.a16BitGames.OrderBy(x => x).ToList(); }
 }

 public List<string> A8Games
 {
    get { return this.a8BitGames.OrderBy(x => x).ToList(); }
 }

 this.comboBox1.DataSource = this.A16Games;
 this.comboBox2.DataSource = this.A8Games;
于 2013-07-29T20:44:58.877 に答える