4

これは私が持っているものです:

public class ViewModel
{
    public BindingList<Row> Rows { get; set; }
    public BindingList<MyElement> Selectables { get; set; }
}

public class Row
{
    public MyElement Selected { get; set; }
}

public class MyElement
{
    public string Value { get; set; }
    public string Friendly { get; set; }
}

これが私が欲しいものです:XtraGrid各セルにコンボボックスエディターがある列を持つ。ドロップダウンオプションの値は、行ごとに異なります。具体的には、使用可能なオプションはのサブセットでViewModel.Selectablesあり、サブセットは実行時にビジネスルールによって定義されます。

これが私がこれを実現しようとする方法です:

私は3つ作成しますBindingSources

  1. viewModelBindingSource: とDataSource = ViewModel

  2. rowsBindingSourceDataSource = viewModelBindingSourceAND付きDataMember = Rows

  3. selectablesBindingSourceDataSource = viewModelBindingSourceANDでDataMember = Selectables

グリッドをに設定しDataSourceましたrowsBindingSource。グリッドにLookupEditのインプレースエディターリポジトリを作成します。repositoryItemLookUpEdit'sDataSourceを列の値として設定selecteablesBindingSource しますrepositoryItemLookUpEditColumnEdit

gridViewsShownEditorイベントに接続します。

this.gridView1.ShownEditor += gridView1_ShownEditor;

メソッドではgridView1_ShownEditor(object sender, EventArgs e)、ビューへの参照を取得できるため、次のようなことができます。

GridView view = sender as GridView;
var newSelectables = new BindingList<MyElement>();
// businesslogic to populate newSelectables ...
var bs = new BindingSource(newSelectables, "");
edit = (LookUpEdit)view.ActiveEditor;
edit.Properties.DataSource = bs;

これは、クリックしたコンボボックスで新しいオプションを取得し、オプションを選択すると、バインドされたオブジェクト、つまりに値が設定される範囲で機能しますRow.Selected

そして今、私の問題として、セルがフォーカスを失うと、セルの内容が空白になります

これは、newでnewを作成したことが原因のようBindingSourceです。この変更を省略すると、代わりにDataSourceの値が使用され、期待どおりに機能するためです。ViewModel.Selectables

それで、この場合、セルに表示されるテキストがフォーカスを失った後に空白になる理由を誰かが知っていますか?

4

5 に答える 5

3

I had a similar problem. In my case the problem was due to changing DataSource property of repositoryItemLookupEdit in the column.
When new DataSource in current row is more restricted and is not able to show other row's values, cells in those rows go blank.

To resolve this, You may use the ShownEditor event and the code sample in the link below:
http://documentation.devexpress.com/#WindowsForms/DevExpressXtraGridViewsBaseColumnView_ShownEditortopic

The trick is, Instead of setting the DataSource of repositoryItemLookupEdit, you get the view.ActiveEditor as a LookupEdit and set its DataSource. Then, other rows are not affected.
Here is a code sample:

void eAdvBandedGridView1_ShownEditor(object sender, EventArgs e)
{
    GridView view = sender as GridView;
    if (view.FocusedColumn.FieldName == "CenterID" && view.ActiveEditor is LookUpEdit)
    {
        LookUpEdit editor = view.ActiveEditor as LookUpEdit; 

        vVoucherItemInfoDTO item = view.GetFocusedRow() as vVoucherItemInfoDTO;

        if (lastFetchedAccount == null || lastFetchedAccount.ID != item.AccountID)
        {
            lastFetchedAccount = accountServiceClient.GetAccountInfo(item.AccountID);
        }
        if (lastFetchedAccount.AllowAllCenters)
            editor.Properties.DataSource = GlobalDataStore.CenterList;
        else
            editor.Properties.DataSource = lastFetchedAccount.AllowedCenterList;

    }
}
于 2012-06-27T23:49:22.680 に答える
3

数日前に同じ問題が発生しましたが、解決策が見つかりませんでした。それから私が理解したのは、ComboEditまたはLookupEditを含むグリッド列にbinidngする値は、ComboEdit/LookUpEditコレクションのVlaueメンバー値と一致する必要があるということです。

一致する値が見つかった場合は、セルに表示メンバーの値が表示されます。それ以外の場合、セルの値は空白になります。

これは私がそれに取り組んだ経験から得たものです。

于 2011-09-27T06:03:44.937 に答える
2

わかりました、それで私はそれの一部を考えました。なぜコンテンツが空白になるのか正確にはわかりません。しかし、それは私がリストに入力する新しいオブジェクトをインスタンス化したという事実と関係がありますnewSelectables。セルがフォーカスを失うと、XtraGridはViewModel.Selectablesを指す元のrepositoryItemLookUpEditに変わり、アイテムのDisplayValueを取得すると思います。選択したアイテムが元のリストに存在しないため、これは失敗します。クローンを作成する代わりに元のオブジェクトを再利用すると、機能するようです。

于 2011-09-26T17:00:40.520 に答える
1

コンボボックスに関連付けられたエディターにイベントハンドラーを追加することで、この動作をオーバーライドできます。例えば

    private void goalTypeEditor_CustomDisplayText(object sender, DevExpress.XtraEditors.Controls.CustomDisplayTextEventArgs e)
    {
        if (e.DisplayText == "")
        {
            string goalTypeId = (string)e.Value;
            RefDataSet refData = ((IParentView)ParentView).RefData;
            string goalTypeLabel = refData.GoalType.FindByGoalTypeID(goalTypeId).Label;
            e.DisplayText = "(No longer in use) " + goalTypeLabel;
        }
    }
于 2012-01-20T11:11:54.170 に答える
0
  • LookUpのDisplayMemberを、表示する列の名前に設定します
于 2013-11-26T09:04:07.637 に答える