0

これが私のコードの一部です:

List<Targets> _myList = new List<Targets>();
RepositoryItemLookUpEdit MyRepositoryItemLookUpEdit = new RepositoryItemLookUpEdit();
MyRepositoryItemLookUpEdit.DataSource = _myList;

public class Targets
{
    public string Target { get; set; }
    public bool ShouldDisplay { get; set; }
    public Targets(string target)
    {
        Target = target;
        ShouldDisplay = true;
    }
}

私の質問:ドロップダウン リストが表示されるときに、ターゲットのみが表示される可能性はありますShouldDisplay == trueか?

_myListはイベント ハンドラーからアクセスできるため、リスト内の項目とそのShouldDisplayプロパティは実行時に変更されることに注意してください。例えば:

public void MyGrid_CellValueChanging(object sender, CellValueChangedEventArgs e)
{
    if (/* the focused Target item appears more than 3 times in the grid*/)
    { 
        thisTarget.ShouldDisplay = false; // so it will be visually removed from the lookUpEdit and the user cannot select the same one anymore
    }
}

ところで、CellValueChanging イベント ハンドラー内の DataSource への割り当ては適切ではありません。DataSource が再割り当てされると、ユーザーが行った変更はすべて破棄されるためです。

4

3 に答える 3

1

この行を変更

MyRepositoryItemLookUpEdit.DataSource = new List<Targets>();//i can't get why you are assigning empty list

//your list which is List<Targets> and contains values. Not the empty one like above
MyRepositoryItemLookUpEdit.DataSource = yourList.Where(x=>x.ShouldDisplay ).ToList();

編集

質問を編集した後、実装する必要があります

INotifyPropertyChanged

インターフェース。その後、ShouldDisplay の値が変更されるたびに、再バインドする必要があります。ここで実際の例を参照してください

于 2013-07-26T19:38:52.020 に答える
0

bindingSource を使用して RepopsitoryItemLookUpEdit を bindingsource にバインドする場合、データソースを再割り当てする必要はありません。

public partial class Form1 : Form
{
    private readonly List<Targets> _targetses;
    private BindingList<Targets> _fiList;

    public Form1()
    {
        InitializeComponent();

        this._targetses = new List<Targets>();
        this._targetses.Add(new Targets("Sample"));
        this._targetses.Add(new Targets("Sample"));
        this._targetses.Add(new Targets("Sample"));
        this._targetses.Add(new Targets("Sample") {ShouldDisplay = false});

        this.bindingSource1.DataSource = this.FilteredList;
        this.lookUpEdit1.Properties.DataSource = this.bindingSource1;
        this.bindingSource1.ListChanged += BindingSource1OnListChanged;

        this._targetses[1].ShouldDisplay = false;
    }

    public BindingList<Targets> FilteredList
    {
        get
        {
            return this._fiList ??
                   (this._fiList = new BindingList<Targets>(this._targetses.Where(x => x.ShouldDisplay).ToList()));
        }
    }

    private void BindingSource1OnListChanged(object sender, ListChangedEventArgs listChangedEventArgs)
    {
        this._fiList.Clear();
        foreach (Targets t in this._targetses.Where(x => x.ShouldDisplay)) { this._fiList.Add(t); }
    }

    #region Nested type: Targets

    public class Targets : INotifyPropertyChanged
    {
        private bool _bShouldDisplay;
        private string _sTarget;

        public Targets(string target)
        {
            Target = target;
            ShouldDisplay = true;
        }

        public string Target
        {
            get { return this._sTarget; }
            set
            {
                if (this._sTarget == value)
                    return;

                this._sTarget = value;
                this.OnPropertyChanged();
            }
        }

        public bool ShouldDisplay
        {
            get { return this._bShouldDisplay; }
            set
            {
                if (this._bShouldDisplay == value)
                    return;

                this._bShouldDisplay = value;
                this.OnPropertyChanged();
            }
        }

        #region INotifyPropertyChanged Members

        public event PropertyChangedEventHandler PropertyChanged;

        #endregion

        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChangedEventHandler handler = this.PropertyChanged;
            if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    #endregion
}

結果:

ここに画像の説明を入力

于 2013-07-26T22:05:43.267 に答える
0

編集:ワークフローを妨げない場合 (データがリアルタイムで編集および再読み込みするのに十分な速さで読み込まれる場合)、ユーザー側のデータとデータベース データを分離しておくことをお勧めします。テーブルにビット フィールドを追加して、アイテムを表示するかどうかを格納し、データベースからデータを取得するときにデータをフィルター処理して最初に表示し、ShouldDisplay を false に設定する変更が行われたときに、次のように記述します。それをデータベースに追加し、リストから削除して、リストを更新します。

もちろん、リストに大量のデータがある場合、このソリューションは実行できない可能性があります。

元の答え:

Ehsan の提案は、私が投稿しようとしていたものです。もう 1 つのオプションは、メインの targetsList (ドロップダウン リストをデータバインドするものは何でも) の項目をループして、次のように新しいリストを作成することです。

List<string> newList = new List<string>();
foreach (Targets t in targetsList)
{
    if (t.ShouldDisplay == true) { newList.Add(t.Target); }
}

そして、ドロップダウンをtargetsListではなくnewListにデータバインドします。しかし、RepositoryItemLookUpEdit の正確な機能についてはよくわからないため、このソリューションは機能しない可能性があります。情報を表示するだけの場合は問題ありませんが、データ自体を操作する必要がある場合は、さらに厄介になる可能性があります。すべては、あなたがそれで何をしているかに依存します。

于 2013-07-26T19:59:08.023 に答える