解决EnableVisualStyles Bug

本文提供了解决WinForm应用中启用虚拟样式后TeeView图标消失的方法,通过设置DrawMode为OwnerDrawAll并响应DrawNode事件来实现图标显示。

一位朋友碰到了一个WinForm的问题,在网上搜了一通,没找到能解决问题的方案,

正好我以前以碰到过,在这里把解决方案呈上,以便有遇到此问题的朋友能有帮助。

 

问题是这样的,当启用了虚拟样式后,设置好的TeeView 的图标就不见了,代码如下:

Application.EnableVisualStyles();

在Debug模式生成的程序没问题,但用Release模式生成则不见了。

 

 在以下地址有一个方法,但不一定能解决问题,

http://www.codeproject.com/KB/bugs/EnableVisualStylesBug.aspx?msg=984714

方法是在调用Application.EnableVisualStyles(); 后再加入代码:Application.DoEvents(); 网上有的朋友说有效,我当时也试过这个方法,没效,不知道是什么原因,VS2005出来时有这个Bug, VS2008出来时问题依旧。

 

闲话少说,不能因为不知道原因就不解决问题吧。

方法超简单,先把 treeView1.DrawMode 设为 TreeViewDrawMode.OwnerDrawAll,然后再响应一下DrawNode事件。

            treeView1.DrawMode = TreeViewDrawMode.OwnerDrawAll;
            treeView1.DrawNode += new DrawTreeNodeEventHandler(treeView1_DrawNode);

事件方法是:

        void treeView1_DrawNode(object sender, DrawTreeNodeEventArgs e)
        {

            e.DrawDefault = true;

             if (e.Node.Bounds.X > 10 && this.treeView1.ImageList != null && this.treeView1.ImageList.Images.Count > e.Node.ImageIndex)
            {
                Image img = this.treeView1.ImageList.Images[e.Node.ImageIndex];
                if (img != null)
                {
                    e.Graphics.DrawImage(img, e.Node.Bounds.X - 19, e.Node.Bounds.Y);
                }
            }
        }

 

引用: http://www.cnblogs.com/roy/archive/2010/04/02/1703379.html

转载于:https://www.cnblogs.com/DoNetCShap/p/4210094.html

### 实现C#中的省市选择界面 以下是一个基于C# WinForms的实现方案,用于创建一个包含两个下拉框(`cmbProvince` 和 `cmbCity`)的窗体。`cmbProvince` 在加载时默认选中第一项,并且 `cmbCity` 根据 `cmbProvince` 的选择动态更新内容。 #### 窗体设计 在 Visual Studio 中创建一个新的 Windows Forms App 项目,并向窗体添加两个 ComboBox 控件,分别命名为 `cmbProvince` 和 `cmbCity`。 #### 代码实现 ```csharp using System; using System.Windows.Forms; public class ProvinceCityForm : Form { private ComboBox cmbProvince; private ComboBox cmbCity; public ProvinceCityForm() { cmbProvince = new ComboBox(); cmbCity = new ComboBox(); // 设置控件属性 cmbProvince.Location = new System.Drawing.Point(10, 10); cmbCity.Location = new System.Drawing.Point(10, 50); cmbProvince.Size = new System.Drawing.Size(200, 25); cmbCity.Size = new System.Drawing.Size(200, 25); cmbProvince.DropDownStyle = ComboBoxStyle.DropDownList; // 只允许从列表中选择[^1] cmbCity.DropDownStyle = ComboBoxStyle.DropDownList; this.Controls.Add(cmbProvince); this.Controls.Add(cmbCity); // 加载事件处理程序 this.Load += new EventHandler(Form_Load); cmbProvince.SelectedIndexChanged += new EventHandler(CmbProvince_SelectedIndexChanged); } private void Form_Load(object sender, EventArgs e) { cmbProvince.Items.Add("广东省"); cmbProvince.Items.Add("湖南省"); cmbProvince.SelectedIndex = 0; // 默认选中第一项[^1] } private void CmbProvince_SelectedIndexChanged(object sender, EventArgs e) { string selectedProvince = cmbProvince.SelectedItem.ToString(); if (selectedProvince == "广东省") { cmbCity.Items.Clear(); cmbCity.Items.Add("广州市"); cmbCity.Items.Add("深圳市"); } else if (selectedProvince == "湖南省") { cmbCity.Items.Clear(); cmbCity.Items.Add("长沙市"); cmbCity.Items.Add("株洲市"); } cmbCity.SelectedIndex = -1; // 清空当前选择 } } public class Program { [STAThread] public static void Main() { Application.EnableVisualStyles(); Application.Run(new ProvinceCityForm()); } } ``` #### 解释 - **默认选中省份**:在窗体加载时,通过 `cmbProvince.SelectedIndex = 0` 设置默认选中第一项。 - **动态更新城市列表**:当用户选择不同的省份时,触发 `CmbProvince_SelectedIndexChanged` 事件,该事件会根据当前选择的省份清空并重新填充 `cmbCity` 的选项列表。 - **清空城市选择**:每当省份发生变化时,清除当前的城市选择以避免不一致[^1]。 ### 测试方法 为了确保功能正常运行,可以进行以下测试: 1. 验证页面加载时是否默认选中了第一个省份。 2. 验证选择不同省份时,城市列表是否正确更新。 3. 验证在切换省份后,城市选择是否被正确清空。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值