簡體   English   中英

DataGridView行顯示但沒有數據

[英]DataGridView rows show up but no data

我正在嘗試將集合(從BindingList繼承)綁定到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)的所有公共屬性也是接口類型。 我添加了一個字符串屬性,其數據神奇地顯示出來。 因此,在上面的示例中,將顯示“文本”列的數據。 但是,LineNumber列的數據不會,因為它是接口類型(ILineNum)。 我想過將調用ToString()來填充這些網格。 現在有什么想法嗎?

當您將對象數據綁定到某個控件時,數據綁定接口將自動在對象上調用“ ToString()”,以便您在綁定到的任何控件中都能獲得體面的字符串表示形式。 對於DataGridView,您將在適當的單元格中看到基礎對象的ToString表示。 但是,當您將數據綁定到接口時,不會對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();
    }
}

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

希望能有所幫助。

您需要將AllowUserToAddRows設置為false;

暫無
暫無

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

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