2011-09-25 98 views
4

這是我有:LookupEdit在XtraGrid中單元格的值變爲空白

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 = viewModelBindingSourceDataMember = Rows

  3. selectablesBindingSourceDataSource = viewModelBindingSourceDataMember = Selectables

我設置網格的DataSourcerowsBindingSource。 我爲網格中的LookupEdit創建一個就地編輯器存儲庫。 我設置repositoryItemLookUpEditDataSourceselecteablesBindingSource 我設置repositoryItemLookUpEdit作爲列的ColumnEdit

我掛鉤到GridView的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新的,因爲如果我在ViewModel.Selectables ommit的DataSource這種變化,則值代替的事實引起的,它按預期工作。

那麼,有沒有人知道爲什麼在這種情況下失去焦點後,單元格中顯示的文本爲空?

+0

你有什麼必然的網格數據源的列名?將數據添加到網格時,您必須具有數據源,否則它將變爲空白。您可以在InitNewRow事件中預先初始化它。 –

+0

@Sres,是的,正如我所描述的那樣,我將網格dataSource設置爲綁定到ViewModel類中的行的BindingSource rowsBindingSource。網格不是空白的。 –

回答

3

幾天前我有同樣的問題,但我沒有找到任何解決方案。我從中可以理解的是,包含ComboEdit或LookupEdit的網格列的值必須與ComboEdit/LookUpEdit集合的Vlaue成員值相匹配。

如果找到匹配的值,它將顯示單元格中的顯示成員值,否則單元格值將爲空。

這就是我從我的工作經驗中得到的。

+0

對,如果你通過「你綁定到網格列的值」,意味着我綁定到附加到該列的lookupEditRepositoryItem的集合,即示例中的Selectables,以及「LookUpEdit集合的值成員值「您指的是我在事件處理程序方法中設置爲lookupEdit的集合,即newSelectables,那麼我同意。 –

+0

您還必須確保綁定集合中只有一個項目具有您選擇的ID,否則該項目將顯示爲空白。 – Maciej

2

好吧,我想出了它的一部分。我不完全確定內容爲什麼會變成空白。但它與我已經實例化了填充列表newSelectables的新對象有關。 我猜測,當單元格失去焦點時,XtraGrid會轉向指向ViewModel.Selectables的原始repositoryItemLookUpEdit以獲取該項目的DisplayValue。由於所選項目不存在於原始列表中,因此失敗。如果我重複使用原始對象而不是克隆它們,它似乎可以工作。

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; 
     } 
    } 
3

我有一個類似的問題。在我的情況下,問題是由於在列中更改repositoryItemLookupEdit的DataSource屬性。
噹噹前行中的新數據源受到更多限制並且無法顯示其他行的值時,這些行中的單元格將變爲空白。

要解決這個問題, 您可以使用ShownEditor事件和下面的鏈接代碼示例:
http://documentation.devexpress.com/#WindowsForms/DevExpressXtraGridViewsBaseColumnView_ShownEditortopic

的訣竅是, 而不是設置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; 

    } 
} 
+0

當我希望網格中的每一行在下拉列表中可能有不同的允許項目列表時,這對我來說很好。 – Coxy

0
  • 設置查找DisplayMember到你想顯示
相關問題