Outlook、Foxmail 在收到新郵件後,在收件匣的後面會顯示新郵件數:收件匣(1)。我們在做應用時有時也需要類似的功能,比如警示管理中顯示警示資訊的條數等。怎麼實現呢?看了 TreeVeiw 和 TreeNode 屬性和方法,沒有發現可以直接實現的;在 Google 和百度上也沒有搜尋到。不過 TreeView 控制項有一個 DrawNode 事件,通過該事件可以自己繪製節點,可以實現我們想要的這種功能:收件匣(1)。我想其他朋友可能也正在思考怎麼實現這個功能呢,共用一下吧,免得大家再走彎路。
實現效果:
實現代碼:private void Form1_Load(object sender, EventArgs e)
{
TreeNode root = new TreeNode("myname@163.com");
root.Name = "root";
root.Nodes.Add("InBox","收件匣");
root.Nodes.Add("OutBox","寄件匣");
root.Nodes.Add("SentBox", "已發送郵件箱");
root.Nodes.Add("Spam", "垃圾郵件箱");
root.Nodes.Add("TrashBox", "廢件箱箱");
this.treeView1.Nodes.Add(root);
this.treeView1.ExpandAll();
// 設定繪製模式為 OwnerDrawText:
// 節點的標籤部分手工繪製,其他部分系統繪製
treeView1.DrawMode = TreeViewDrawMode.OwnerDrawText;
}
private void treeView1_DrawNode(object sender, DrawTreeNodeEventArgs e)
{
// 由系統繪製
e.DrawDefault = true;
// 在節點的後面繪製“新郵件數”。類似:收件匣(3)
if (e.Node.Tag != null)
{
string newMail = string.Format("({0})", e.Node.Tag.ToString());
e.Graphics.DrawString(newMail, e.Node.TreeView.Font, Brushes.Blue, e.Bounds.Right, e.Bounds.Top);
}
}
private void newMailButton_Click(object sender, EventArgs e)
{
TreeNode inBoxNode = this.treeView1.Nodes["root"].Nodes["InBox"];
inBoxNode.Tag = "3";
this.treeView1.Refresh();
}
private void readMailButton_Click(object sender, EventArgs e)
{
TreeNode inBoxNode = this.treeView1.Nodes["root"].Nodes["InBox"];
inBoxNode.Tag = null;
this.treeView1.Refresh();
}