2016-07-19 3 views
0

DataTableにバインドされたDataGridViewがあります。 のDataTableの列の一つは、タイプIMessagesであるクラスのインスタンスを表すDataGridViewCellにテキストを表示する方法

DataTable source = _applicationManager.Retrieve(); // Populate DataTable 
source.Columns.Add("Messages", typeof(IMessages)); 
dataGridView.DataSource = source; 

IMessagesインタフェース:

interface IMessages : IEnumerable<IMessage> 
{ 
    string GetMessages { get; } 
    string ToString(); 
} 

メッセージクラス:

class Messages : IMessages 
{ 
    /* This code is less relevant, here just to show you the entire picture 
    private List<IMessage> _messagesList;   
    public string GetMessages 
    { 
     get 
     { 
      var messages = new StringBuilder(); 

      foreach (IMessage message in _messagesList) 
      { 
       messages.AppendLine(message.ToString()); 
      } 

      return messages.ToString(); 
     } 
    } 
    ***********************************/ 

    public override string ToString() 
    { 
     return "warning"; // TODO    
    } 
} 

のDataGridViewイベント:

private void dataGridView_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e) 
{     
    var messages = _applicationManager.GetMessages() as IMessages; 
    if (messages.Any()) 
    { 
     dataGridView.Rows[e.RowIndex].Cells["Messages"].Value = messages; 
    } 
} 

private void dataGridView_CellClick(object sender, DataGridViewCellEventArgs e) 
{ 
    var messages = dataGridView.Rows[e.RowIndex].Cells["Messages"].Value as IMessages; 
    if (messages != null) 
    { 
     MessageBox.Show(messages.GetMessages, "Messages", MessageBoxButtons.OK, MessageBoxIcon.Warning); 
    } 
} 

問題は、DataGridViewがセルに「警告」単語を表示せず、リンクが正常に動作していてもセルが空白であることです。 私は、メッセージクラスのToString()をオーバーライドするとそれを作るが、そうではないと思った。むしろDataTable

DataTable source = _applicationManager.Retrieve(); // Populate DataTable 
source.Columns.Add("Messages", typeof(IMessages)); 
// ------- changed code ------------------ 
// this is just an example, you can also place a loop here 
// and iterate through all the lines in the DataTable and set the object 
// in the "Messages" column 
source.Rows[0]["Messages"] = messageobject; 
// -------------------------------------------------- 
dataGridView.DataSource = source; 

すなわちソースに直接DataGridViewコントロールがしてバインドされているので、可能性が表示されていない理由を追加し、RowsAddedイベントハンドラに値を追加すること

enter image description here

答えて

0

問題が見つかりました。

IMessagesインターフェイスを削除してMessagesインスタンスを処理する場合、ToString()オーバーライドメソッドがフェッチされ、セルに「警告」テキストが表示されます。

この次の行を呼び出すと、ToString()メソッドが呼び出されます。しかし、セルがインターフェイスにバインドされている場合、ToString()メソッドは呼び出されません。

private void PODetailsDGV_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) 
    { 
     if (e.RowIndex == -1) return; 

     if (e.Value != null && dataGridView.Columns["Messages"].Index == e.ColumnIndex) 
     { 
      e.Value = e.Value.ToString(); 
     } 
    } 

enter image description here

:それはインターフェイスを退治せずに動作させるためには

dataGridView.Rows[e.RowIndex].Cells["Messages"].Value = messages; 

は、私はDataGridViewののセルの書式設定イベント中のToString()メソッドを呼び出し

0

DataSourceDataTableのソースから値を読み取っているので現在無視されているグリッドコントロールのセルに値を設定しようとしていますが、今すぐDataTableにはメッセージobjeがありませんctを任意の行に入力します。これは私が間違っているかもしれないという私の前提です。

関連する問題