簡體   English   中英

在將結果綁定到帶有NHibernate組合框的DataGridView時是否存在問題

[英]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的簡潔得多的模型(但是,是的,您失去了所有精美的控件綁定)。 如果您不願意,可以使用以下三種選擇:

  1. 禁用延遲加載(出於性能原因,這是一個非常糟糕的主意)
  2. 您渴望在查詢時根據需要加載實體(SetFetchMode(“ Brand”,FetchMode.Join),NHibernateUtil.Initialize等。)
  3. 准備一個渴望加載所有實體的viewmodel對象,並將其發送到您的aspx頁面。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM