LookupEdit в ячейке XtraGrid значение становится пустым - PullRequest
4 голосов
/ 25 сентября 2011

Это то, что у меня есть:

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, подмножество определяется businessrules во время выполнения.

Вот как я пытаюсь это сделать:

Я создаютри BindingSources

  1. viewModelBindingSource: с DataSource = ViewModel

  2. rowsBindingSource: с DataSource = viewModelBindingSource И DataMember = Rows

  3. selectablesBindingSource с DataSource = viewModelBindingSource И DataMember = Selectables

Я установил для сетки DataSource значение rowsBindingSource.Я создаю хранилище редактора на месте для LookupEdit в сетке.Я установил repositoryItemLookUpEdit DataSource на selecteablesBindingSource Я установил repositoryItemLookUpEdit как ColumnEdit значение столбца

Я подключаюсь к gridViews ShownEditor событие:

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.

И теперь к моей проблеме, когда ячейка теряет фокус, содержимое ячейки становится пустым .

Это, кажется, как-то связано с тем, что я создаю новый BindingSource с новым, потому чтоесли я пропускаю это изменение DataSource, тогда вместо него используются значения в ViewModel.Selectables, и оно работает как положено.

Итак, кто-нибудь знает, почему текст, отображаемый в ячейкегаснет после потери фокуса в этом случае ??

Ответы [ 5 ]

3 голосов
/ 28 июня 2012

У меня была похожая проблема. В моем случае проблема была связана с изменением свойства DataSource repositoryItemLookupEdit в столбце.
Когда новый источник данных в текущей строке более ограничен и не может отображать значения других строк, ячейки в этих строках становятся пустыми.

Чтобы решить эту проблему, Вы можете использовать событие ShownEditor и пример кода по ссылке ниже:
http://documentation.devexpress.com/#WindowsForms/DevExpressXtraGridViewsBaseColumnView_ShownEditortopic

Хитрость в том, Вместо установки DataSource для repositoryItemLookupEdit вы получаете view.ActiveEditor в качестве LookupEdit и устанавливаете его DataSource. Тогда другие строки не будут затронуты.
Вот пример кода:

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;

    }
}
3 голосов
/ 27 сентября 2011

У меня была такая же проблема несколько дней назад, но я не нашел решения для нее.Из этого я понял, что значения, которые вы привязываете к столбцу сетки, содержащему ComboEdit или LookupEdit, должны соответствовать значению Vlaue Member из коллекции ComboEdit / LookUpEdit.

Если получится найти соответствующее значение, чем онопокажите значение отображаемого элемента в ячейке, иначе значение ячейки будет пустым.

Это то, что я получил из своего опыта работы с ним.

2 голосов
/ 26 сентября 2011

Хорошо, так что я понял часть этого. Я не совсем уверен, почему содержание становится пустым. Но это связано с тем, что я создал новые объекты, которые заполняют список newSelectables. Я предполагаю, что когда ячейка теряет фокус, XtraGrid превращается в исходный repositoryItemLookUpEdit, который указывает на ViewModel.Selectables, чтобы получить DisplayValue элемента. Поскольку выбранный элемент не существует в исходном списке, это не удастся. Если я буду использовать оригинальные объекты вместо того, чтобы их клонировать, это, похоже, сработает.

1 голос
/ 20 января 2012

Вы можете переопределить это поведение, добавив обработчик событий в редактор, связанный с полем со списком.например,

    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;
        }
    }
0 голосов
/ 26 ноября 2013
  • Установите для DisplayMember LookUp имя столбца, который вы хотите показать
...