[英]Is there an issue binding a result to a DataGridView with combo boxes with NHibernate
我遇到的問題無法解決。
我綁定一個DataGridView並在運行時創建我的列。 文本列可以正常工作,但是下拉菜單出現問題,特別是出現System.FormatException異常。 我將List <>綁定到從數據庫檢索的datagridview。
網格視圖的數據源的結構如下:
-產品編號
- 評論
- 名稱
-品牌:IBrand
-生產商:IBrand
IBrand的結構如下:
- ID
- 名稱
創建列時,使用以下代碼:
DataGridViewComboBoxColumn column = new DataGridViewComboBoxColumn();
column.DisplayMember = "Name";
column.ValueMember = "ID";
column.DataPropertyName = "Manufacturer";
column.ValueType = typeof(IBrand);
column.DataSource = [List<> of IBrand], returned from NHibernate
我要去哪里錯了? 它使我發瘋,當我捕獲異常時它顯示得很好-但顯然,我不想捕獲異常,因為某處存在問題。
我唯一能想到的是NHibernate在某種程度上引起了這里的問題?
簡短的答案,是可能的! 我僅使用Get Property在Nhiberante模型中創建了一個屬性
public virtual Area Area { get; set; }
public virtual string Nome { get; set; }
public virtual string Descricao { get; set; }
public virtual bool IsActive { get; set; }
public virtual int Area_Id
{
get { return this.Area != null ? Area.Id : 0; }
}
我的屬性Area_Id是Calculate屬性,我沒有在FluentMapping中映射此字段。
public class CargoMapping : ClassMap<Cargo>
{
public CargoMapping()
{
this.Id(x => x.Id);
this.Map(x => x.Nome);
this.Map(x => x.Descricao);
this.Map(x => x.IsActive);
this.References(x => x.Area);
}
}
然后我將此屬性稱為在DatagridView中填充我的ComboBox
DataGridViewComboBoxColumn dtgViewColumn = new DataGridViewComboBoxColumn();
dtgViewColumn.DataPropertyName = "Area_Id";
dtgViewColumn.HeaderText = "Area";
dtgViewColumn.Width = 120;
dtgViewColumn.DataSource = db.GetActive<Area>();
dtgViewColumn.ValueMember = "Id";
dtgViewColumn.DisplayMember = "Nome";
this.StarkDataGridView.Columns.Add(dtgViewColumn);
this.StarkDataGridView.ReadOnly = false;
this.StarkDataGridView.Columns["Id"].ReadOnly = true;
this.StarkDataGridView.AutoGenerateColumns = false;
this.StarkDataGridView.Columns["Id"].DisplayIndex = 0;
this.StarkDataGridView.Columns["Nome"].DisplayIndex = 1;
this.StarkDataGridView.Columns["Descricao"].DisplayIndex = 3;
this.StarkDataGridView.Columns["IsActive"].DisplayIndex = 4;
this.StarkDataGridView.Columns["IsActive"].HeaderCell.Value = "Ativo";
this.StarkDataGridView.Columns["Delete"].DisplayIndex = 5;
this.StarkDataGridView.Columns["Area"].Visible= false;
this.StarkDataGridView.Columns["Area_Id"].Visible = false;
希望對您有幫助!!
我不確定下面的答案是否與您遇到的異常直接相關,但我相信它將為您省去很多麻煩。
您不應將nhibernate返回的對象綁定到UI。 將它們投影到DTO或ViewModel對象,並將它們綁定到UI。
NHibernate是一個ORM,旨在將您的域對象(構成業務邏輯的互連對象的孔圖)映射到關系數據庫持久性存儲。 為了做到這一點,NHibernate使用延遲加載來避免將所有對象圖都加載到內存中。 為了執行延遲加載,NHibernate使用從其代理的類繼承的生成的代理。 不建議將代理綁定到UI,因為代理需要ISession保持活動狀態才能進行延遲加載。
正如eti所指出的,這絕對是一個延遲加載問題。 當您獲取商品並啟用了延遲加載功能(默認設置)時,您將獲取所有商品,但僅獲取品牌ID。 然后,當您在datagridview中顯示產品列表時,nhibernate嘗試加載品牌名稱。 關閉會話對象后,它就不能延遲加載品牌實體,因此您會收到錯誤消息。 我強烈建議您看一下ASP.Net MVC。 它具有使用ORM的簡潔得多的模型(但是,是的,您失去了所有精美的控件綁定)。 如果您不願意,可以使用以下三種選擇:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.