如何在表示类实例的DataGridViewCell中显示文本

时间:2016-07-19 09:31:16

标签: c# .net datagridview datatable

我有一个绑定到DataTable的DataGridView。 DataTable的其中一列是Type IMessages

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没有显示&#34;警告&#34;在单元格中的单词,链接工作正常,但单元格是空白的。 我认为在Messages类中重写ToString()会使它成为但它没有。

enter image description here

2 个答案:

答案 0 :(得分:0)

而是在RowsAdded事件处理程序中添加值,直接在源代码中添加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控件与DataSource绑定忽略,因为它正在从源DataTable读取值,而现在DataTable在任何行中都没有Message对象。这是我的假设我可能是错的。

答案 1 :(得分:0)

我发现了问题。

如果我要删除IMessages接口并处理Messages实例,则会获取ToString()重写方法,并在单元格中显示“警告”文本。

调用以下行时,将调用ToString()方法。但是当单元格绑定到接口时,不会调用ToString()方法。

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

为了使它在不脱离接口的情况下工作,我在DataGridView的单元格格式化事件期间调用了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