2009-11-05 91 views
1

我想綁定一個集合(從BindingList繼承)到DataGridView。網格標題顯示正常,我得到了我期望的行數。但是,這些單元格是空的。有沒有其他人有這個問題?如果是這樣,你是如何解決它的?我曾與其他有同樣問題的人談過,但他們不記得他們是如何解決這個問題的。我試圖創建一個簡單的版本來顯示問題,但沒有任何運氣。所以我很抱歉,我沒有包含任何代碼。DataGridView行顯示,但沒有數據

編輯#1:

我不認爲這個代碼將有助於但爲了以防萬一。我已經簡化了一些內容,以防止我們需要概述代碼的47層。但就像我說的,我不能用這樣一個非常簡單的例子重新創建問題。我並不是真的想要分析代碼 - 只是那些遇到這個問題的人的智慧的話。當然,我不是唯一一個。

public interface ISearchResultCollection : IList<ISearchResult> 
{ 
... 
} 

public class SearchResultCollection : BindingList<ISearchResult>, ISearchResultCollection 
{ 
... 
} 

public interface ISearchResult 
{ 
    ILineNum LineNumber {get; set;} 
    string Text {get; set;} 
} 

public class SearchResult 
{ 
... 
} 

ISearchResultCollection results = objectToSearch.Find("searchstring"); 
dataGridView1.DataSource = results; 

編輯#2:

我想我已經得到了領先優勢。表示項目(ISearchResult)的所有公共屬性都是接口類型。我添加了一個字符串屬性,其數據奇蹟般地顯示出來。所以,在上面的例子中,Text列的數據會顯示出來。但是LineNumber列的數據不會因爲它是一個接口類型(ILineNum)。我想ToString()將被調用來填充這些網格。現在有什麼想法?

+0

你能舉出更多你試圖綁定的對象的例子嗎?例如,「從BindingList繼承的集合」是什麼樣的?你如何將你的對象綁定到DataGridView?直接或通過BindingSource?你確定你的對象有數據嗎? 這是很難回答,沒有代碼分析。 :) – 2009-11-05 20:17:23

+0

我做了一些編輯以包含代碼的外殼。我不確定這會有多大幫助。我已經驗證調試器中有數據。 – bsh152s 2009-11-05 21:08:06

回答

1

當您將某個對象綁定到某個控件時,數據綁定接口將自動在您的對象上調用「ToString()」,以便在您綁定的任何控件中獲得體面的字符串表示。在DataGridView的情況下,您將在合適的單元格中看到底層對象的ToString'd表示形式。但是,當您綁定到接口時,不會對ToString()進行此類調用。這意味着您的DataGridView將顯示一個空單元格,但這很容易讓人誤解,因爲綁定的對象實際上應該存在 - 它只是沒有任何值顯示在單元格中。

要解決這個問題,您需要自己處理顯示值的格式。在DataGridView中,這可以通過處理CellFormatting事件來實現。只要任何單元格需要格式化該值,就會觸發此事件,因此您必須小心,不要在此處理程序中放置太多沉重的邏輯。在你的情況下,你需要做的就是在底層對象上調用「ToString()」。所以,你可以處理CellFormatting事件再使用這樣的事情在你的處理器:

private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) 
{ 
    if (e.Value != null && dataGridView1.Columns[e.ColumnIndex] == theRelevantColumn) 
    { 
     e.Value = e.Value.ToString(); 
    } 
} 

在執行邏輯之前,我們檢查的特定列上面的代碼,但是這是可選的,你自己的情況可能會有所不同。要注意的要點是,我們獲取傳遞給事件參數的原始對象,並且我們需要做的就是將格式化值設置回事件參數中。在這種情況下,通過在基礎對象上調用「ToString()」來生成格式化值。在您的DataGridView中,您現在將在適當的單元格中看到此格式化的值。

希望有所幫助。

0

您需要將AllowUserToAddRows設置爲false;