仅当用户单击ListBox时才会触发DrawItem事件

时间:2015-08-20 10:05:53

标签: c# .net listbox visual-studio-2015 ondrawitem

我正在使用VS 2015在C#中编写客户端/服务器WinForms应用程序。

我有一个 ListBox 控件,其 DrawItem 事件是所有者绘制的(是的,我设置了 DrawMode 属性为 OwnerDrawFixed ),每次收到新邮件时都必须重新绘制。

我在此reference之后使用此回调:

Error: Column 'id' in where clause is ambiguous 
Statement: SELECT * FROM cms_content LEFT JOIN cms_posts ON type = id WHERE id = ? 
Arguments:
Array
(
    [۰] => 30
)

这是 MeasureItem 方法:

private void chatLobby_DrawItem(object sender, DrawItemEventArgs e)
{
    e.DrawBackground();

    int ItemMargin = 0;
    string last_u = "";

    foreach(Message m in ChatHistory[activeChatID])
    {
        // Don't write the same user name
        if(m.from.name != last_u)
        {
            last_u = m.from.name;

            e.Graphics.DrawString(last_u, ChatLobbyFont.Username.font, ChatLobbyFont.Username.color, e.Bounds.Left, e.Bounds.Top + ItemMargin);
                ItemMargin += ChatLobbyFont.Message.font.Height;
        }

        e.Graphics.DrawString("  " + m.message, ChatLobbyFont.Message.font, ChatLobbyFont.Message.color, e.Bounds.Left, e.Bounds.Top + ItemMargin);

        ItemMargin += ChatLobbyFont.Message.font.Height;
    }

    e.DrawFocusRectangle();
}

使用private void chatLobby_MeasureItem(object sender, MeasureItemEventArgs e) { // No messages in the history if(ChatHistory[activeChatID][0] == null) { e.ItemHeight = 0; e.ItemWidth = 0; } string msg = ChatHistory[activeChatID][e.Index].message; SizeF msg_size = e.Graphics.MeasureString(msg, ChatLobbyFont.Message.font); e.ItemHeight = (int) msg_size.Height + 5; e.ItemWidth = (int) msg_size.Width; } 收到并插入邮件,它确实有效,由调试器确认。

ListBox仅在我点击它时重绘(我认为它会引发焦点)。

我已经尝试了ListBox.Add().Update().Refresh() 而没有运气

有没有办法从代码中触发.Invalidate()

1 个答案:

答案 0 :(得分:0)

经过一些研究,我找到了解决方案:当控件被更改时,会调用 DrawItem 事件。

事实上,.Add()可以解决问题。 我改变了我的更新功能:

private void getMessages()
{
    // ... <--- connection logic here

    chatLobby.Items.Add(" "); // Alters the listbox
}