精华内容
下载资源
问答
  • 各位大神,小弟最近刚学习C#,刚学习线程刷新winform,//注释代码是没有问题的,但是我想用红色的那部分代码实现,搞了半天也出不来,希望大鸟们解释下,帮我看看哪里出错了,谢过~~~ using System; using ...
  • winform上大概有40多个控件,主要为 textbox,NI系列的AxCWSlide,AxCWKnob,AxCWGraph 接收端启用一个事件把数据传递到winform端,winform端按照规则分类后传递到各个控件,规则我是在控件的tag内置定的 现在的...
  • 问题: c#创建自定义控件winform上添加该控件属性为空白。 原因:通过对代码一点一点的分析,查出在OnPaint重画时间中添加了一Invalidate...在使用控件时错做完成后在最后加一Refresh()事件即可刷新控件

    问题: c#创建自定义控件在winform上添加该控件属性为空白。

    原因:通过对代码一点一点的分析,查出在OnPaint重画时间中多添加了一个Invalidate事件,使得一直重绘,造成了该问题。去掉该事件,问题就解决了。

    在使用控件时错做完成后在最后加一个Refresh()事件即可刷新该控件。

    展开全文
  • DevExpress Winforms Controls 内置140多个UI控件和库,完美构建流畅、美观且易于使用的应用程序。点击“了解更多”获取DevExpress WinForm v20.1完整版下载在很多时候,我们做一些非常规化的界面的时候,往往需要...

    DevExpress Winforms Controls 内置140多个UI控件和库,完美构建流畅、美观且易于使用的应用程序。

    点击“了解更多”获取DevExpress WinForm v20.1完整版下载

    在很多时候,我们做一些非常规化的界面的时候,往往需要创建一些用户控件,在其中绘制好一些基础的界面块,作为后续重复使用的一个单元,用户控件同时也可以封装处理一些简单的逻辑。在开发Winform各种类型项目,我都时不时需要定制一些特殊的用户控件,以方便在界面模块中反复使用。我们一般是在自定义的用户控件里面,添加各种各样的界面控件元素,或者封装一些特殊的函数处理共外部调用等。本篇随笔主要介绍基于DevExpress的Winform开发经验,介绍一个类似看板信息的用户控件,并在TabelLayout和StackLayout布局控件中进行展示。

    一、用户控件界面的处理

    在偶尔的一个场合下,看到一个牙医管家的软件界面做的非常不错,其中有一个预约列表的界面感觉非常好,如下界面所示。

    bf3ed54df666b6cbcee17cd3e7e63d72.png

    其中它的每个用户信息列表里面,都是一个综合信息的展示,非常直观,估计应该是用户自定义控件做的。

    在其中里面,有不同的字体,各式图标,以及内容的信息展示, 这个我在DevExpress的列表控件里面,没有看到可以如此定义列表内容的,在DevExpress的GridView里面有一个看板模板的定义有点接近,但是试了一下,可调性不好,于是放弃寻求其他接近方案,玩遍DevExpress的控件后,发现最好的方式应该是自定义用户控件的方式来解决这个界面问题。

    花了一点时间,制作了一个用户控件,在其中添加一个LayoutControl方便控制布局,添加一些标签以及设置了一些图标,得到下图所示。

    6e9585fcf6e15d72593d7330dd822815.png

    左侧的颜色条由于使用Group控件,因此宽度暂时无法调整,如果介意大小,我们可以在其中在创建一个LayoutControl,然后在其中方式内容即可。

    我们改变布局,然后添加一个颜色块,得到类似界面如下所示。

    5faec98403508f283df69ae0fcdecf08.png

    我们来定义一下用户控件的源码部分,修改其中源码,增加对应的属性,方便动态设置用户控件的相关属性,如颜色块,项目背景色,以及绑定的对象信息等内容。

    7c81fbc8563bad788ec84485340f64e0.png

    然后在界面加载完毕后,设置对应的信息和颜色信息,如下代码所示。

    /// /// 窗口加载事件/// /// /// private void UserItemControl_Load(object sender, EventArgs e){BindData();RefreshColor();}/// /// 根据用户定义信息,显示不同的内容/// private void BindData(){if(this.UserItemInfo != null){var info = this.UserItemInfo;this.lblCustomerName.Text = info.CustomerName;this.lblMobile.Text = info.Mobile;this.lblReceiver.Text = info.Receiver;this.lblRecordDate.Text = info.RecordDate;this.lblRecordNo.Text = info.RecordNo;this.lblDealType.Text = "";this.lblStar.ImageOptions.ImageIndex = GetStarImageIndex(info.Stars);if (!info.IsVip){this.lblVip.Visibility = LayoutVisibility.Never;}}}/// /// 刷新背景色/// private void RefreshColor(){if (ItemBlockColor != Color.Empty){this.itemColor.AppearanceItemCaption.BackColor = ItemBlockColor;}if (ItemBackColor != Color.Empty){layoutControl1.BackColor = ItemBackColor;}}

    但我们鼠标浮动在项目上或者离开的时候,或者单击某项的时候,我们变换下颜色,方便区分显示。

    private void layoutControl1_MouseLeave(object sender, EventArgs e){if (!this.IsSelected){this.layoutControl1.ResetBackColor();}}private void layoutControl1_MouseEnter(object sender, EventArgs e){if (!this.IsSelected)this.layoutControl1.BackColor = Color.FromArgb(192, 255, 192);}private void layoutControl1_Click(object sender, EventArgs e){this.IsSelected = true;OnItemClick?.Invoke(this, e);}

    完成这些后,我们需要在窗体上对内容进行初始化。

    最后我们看看界面的效果如下所示

    c9c3ef92da9a0bee4cc7128611589418.png

    或者下面这样的界面布局。

    90a0fbc63d26da33e4a9826ca86f2e86.png

    如果嫌弃边框红色不好看,我们 可以修改边框为灰色调一点的,这样总体看起来效果如下所示。

    154af109981047f77dfbbd1acfd6f6af.png

    得到和我们最终需要的界面很接近了。

    一般除了悬浮鼠标颜色变化外,控件单击后,我们会设置不同的背景色,以示区分。

    /// /// 是否选中节点/// public bool IsSelected{get{return m_IsSelected;}set{m_IsSelected = value;this.ItemBackColor = value ? Color.FromArgb(255, 255, 192) : Color.Transparent;this.RefreshColor();}}

    一般列表界面中,我们除了支持鼠标移动、单击变色的效果外,我们还希望支持通过键盘箭头上下键进行上下浏览项目。我们如果需要使用键盘的按键,需要设置窗体的KeyPreview属性为True,

    然后跟踪按键的事件即可,如下所示。

    this.KeyPreview = true;this.KeyUp += FrmKanBan_KeyUp;

    按键事件捕捉处理如下所示,主要就是判断选中的用户控件,并对面板的子控件的选中效果进行处理。

    private void FrmKanBan_KeyUp(object sender, KeyEventArgs e){//单击鼠标或者切换按键,会触发用户控件获得selectItem对象,可以进行箭头上下移动if (selectItem != null){var panel = selectItem.Parent;if (panel != null){//获取操作项的索引值int oldIndex = panel.Controls.IndexOf(selectItem);if (e.KeyCode == Keys.Up){if (oldIndex > 0){//通过序号获得新的控件,并单击它触发选择事件var newCtrl = panel.Controls[oldIndex - 1];Item_OnItemClick(newCtrl, new EventArgs());}}else if (e.KeyCode == Keys.Down){if (oldIndex < (panel.Controls.Count - 1)) { //通过序号获得新的控件,并单击它触发选择事件 var newCtrl = panel.Controls[oldIndex + 1]; Item_OnItemClick(newCtrl, new EventArgs()); } } } } }

    界面中用户控件的切换选中效果,需要先清空之前所有的选择,然后在设置新的选中控件,所以还需要对控件触发单击事件进行处理,如下所示。

    /// /// 选中的用户控件对象实例/// UserItemControl selectItem = null;/// /// 单击用户控件,触发清除所有标记后,再次设置选中的项目标记/// private void Item_OnItemClick(object sender, EventArgs e){//清空所有控件的选中标记var panel = (PanelControl)((Control)sender).Parent;foreach (Control ctrl in panel.Controls){var item = ctrl as UserItemControl;if(item != null){item.IsSelected = false;}}//设置选中控件selectItem = ((UserItemControl)sender);selectItem.IsSelected = true;this.Text = selectItem.UserItemInfo.CustomerName + "-选中";//如果在面板中遮挡,移动滚动条,可以查看到完整用户控件界面panel.ScrollControlIntoView(selectItem);}

    如下效果所示。

    6cfa9ac45a6fba5b076650593d2a599f.png
    二、TabelLayout和StackLayout布局控件的介绍和使用

    我们在做Winform开发的时候,一般知道,微软传统Winform的布局提供两个控件,FlowLayoutPanel和TableLayoutPanel,一个是流式布局,一个是表格布局,各有各的用处。流式布局主要就是按照顺序挨个放置控件,表格布局主要按照表格的定义的行列单元格,严格放置控件,表格单元格控制强度更大,而且控件具有拉伸效果。

    对于DevExpress,我们一般还是倾向于采用它提供给的控件来做界面,可以很好融合它的皮肤效果,相对于Winform传统两个布局控件,DevExpress提供了两个封装效果相当的控件布局StackPanel和 TablePanel,他们的效果实现大同效果,不过调用的接口不同。

    2d4f1e7e4b1e71122f4e2ddf39117af8.png

    对于两个控件,我们希望里面的内容自动出现滚动条,那么设置属性AutoScroll 为True即可,如下代码所示。

    panel.AutoScroll = true;

    而StackPanel另外需要LayoutDirection,也就是控件顺序展现的方式,如下代码所示。

    panel.LayoutDirection = StackPanelLayoutDirection.TopDown;

    使用StackPanel面板来测试展示用户控件列表的界面代码如下所示。

    /// /// 使用StackPanel对用户控件布局进行处理/// private void InitPanel(StackPanel panel){panel.AutoScroll = true;//面板自动出现滚动条panel.LayoutDirection = StackPanelLayoutDirection.TopDown;//从上往下展示panel.Controls.Clear();//清空界面var list = GetInfoList(); //获取用户控件绑定的对象信息列表for (int i = 0; i < list.Count; i++) { //定义用户控件实例 var item = new UserItemControl(); item.UserItemInfo = list[i];//绑定对象信息 item.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; item.ItemBlockColor = colors[i %10]; //变化颜色 item.OnItemClick += Item_OnItemClick;//触发选中事件 panel.Controls.Add(item); } }

    对于表格布局TablePanel控件来说,使用初始化控件的方式也差不多,不过有个别地方注意即可。

    /// /// 使用TablePanel对用户控件布局进行处理/// private void InitPanel(TablePanel panel){panel.AutoScroll = true;//面板自动出现滚动条panel.Controls.Clear();//清空界面panel.Rows.Clear();//清空行panel.Columns.Clear();//清空列//添加列定义(增加一个列即可)panel.Columns.Add(new TablePanelColumn(TablePanelEntityStyle.Relative, 55F));var list = GetInfoList(); //获取用户控件绑定的对象信息列表for (int i = 0; i < list.Count; i++) { //定义行信息 panel.Rows.Add(new TablePanelRow(TablePanelEntityStyle.AutoSize, 100F)); //定义用户控件实例 var item = new UserItemControl(); item.UserItemInfo = list[i]; //定义拉伸效果 item.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; item.ItemBlockColor = colors[i % 10]; //变化颜色 item.OnItemClick += Item_OnItemClick;//触发选中事件 //先添加控件到面板集合中 panel.Controls.Add(item); //设置控件的单元格位置 panel.SetCell(item, i, 0); } //添加多一行,确保布局 panel.Rows.Add(new TablePanelRow(TablePanelEntityStyle.AutoSize, 100F)); }

    添加控件的时候,需要注意下面的代码,才能正常展示控件信息,否则无法看到用户控件。

    //先添加控件到面板集合中panel.Controls.Add(item);//设置控件的单元格位置panel.SetCell(item, i, 0);

    最后对比下效果,左边是TablePanel,右边是StackPanel展现出来的效果。

    a86a9ff21cf4c614c884c2981baa4831.png

    以上就是界面如何在DevExpress开发中使用各种用户控件进行用户控件的创建、以及实现鼠标进入、移出、单击的不同效果,以及实现键盘上下箭头按键的事件选中效果,并介绍DevExpress中两个布局控件TabelPanel和StackPanel的正常使用,达到展示控件信息的作用。

    本文转载自-伍华聪

    展开全文
  • C#winform多个窗体之间相互传递数据操作。弹出一个新窗体,选中一个数据并传递到父窗体的某个控件上,可以是TextBox也可以是DataGrideView之间相互传递数据,处理并刷新等。
  • winform中的UI刷新总结

    2021-02-27 14:56:37
    winform中的控件刷新是一非常常见的知识点,可以通过Invoke方法很简单地去实现。在一次产测开发中我就经常遇到控件刷新的很问题,比如说控件比较,调用刷新方法频繁的时候我们该怎么操作以及采用自动刷新UI...


    前言

    winform中的控件刷新是一个非常常见的知识点,可以通过Invoke方法很简单地去实现。在一次产测开发中我就经常遇到控件刷新的很多问题,比如说控件比较多,调用刷新方法频繁的时候我们该怎么操作以及采用自动刷新UI怎么实现。


    一、管理控件刷新

    为了便于管理每个Form中的控件,并且结合安卓中的R.java文件,可以给每个Form创建一个R_xxForm.cs文件。

    1.创建R_HomeForm.cs

    代码如下(拿button为例):

     public class R_HomeForm{
    	 	public class Button {
                public const int idConTips = 0x000;
                public const int idOKConTips = 0x100;
                public const string nameConTips = "ConTips";
                
                public const int idSoftWareButton = 0x001;
                public const string nameSoftWareButton = "SoftWareButton";
                
                public const int idFlashSizeButton = 0x002;
                public const string nameFlashSizeButton = "FlashSizeButton";
                
                public const int idDDRSizeButton = 0x003;
                public const string nameDDRSizeButton = "DDRSizeButton";
                
                public const int idWIFITestButton = 0x004;
                public const string nameWIFITestButton = "WIFITestButton";
                
                public const int idBTTestButton = 0x005;
                public const string nameBTTestButton = "BTTestButton";
                
                public const int idUARTTestButton = 0x006;
                public const string nameUARTTestButton = "UARTTestButton";
                
                public const int idKeyTestButton = 0x007;
                public const string nameKeyTestButton = "KeyTestButton";
                
                public const int idLEDTestButton = 0x008;
                public const string nameLEDTestButton = "LEDTestButton";
                
                public const int idAMPTestButton = 0x009;
                public const string nameAMPTestButton = "AMPTestButton";
                
                public const int idMICTestButton = 0x00a;
                public const string nameMICTestButton = "MICTestButton";
                
                public const int idRemoteStartButton = 0x00b;
                public const string nameRemoteStartButton = "RemoteStartButton";
                
                public const int idRemoteLearnButton = 0x00c;
                public const string nameRemoteLearnButton = "RemoteLearnButton";
                
                public const int idCMTLearnButton = 0x00d;
                public const string nameCMTLearnButton = "CMTLearnButton";
                
                public const int idZigbeeVersionButton = 0x00e;
                public const string nameZigbeeVersionButton = "ZigbeeVersionButton";
            }
    }
    

    2.在Home_Form.cs中设置委托和对应的刷新方法

    代码如下:

    //委托方法
            private delegate void delegateAddText();
            private delegate void delegateButton();
    
    
     //Button显示
            public void ShowButton(int id) {
                switch (id){
                    //刷新按键为Disable模式
                    case R_HomeForm.Button.idConTips:
                        ConTips.Invoke(new delegateAddText(viewShowClass.AddTipsNC));
                        break;
                    case R_HomeForm.Button.idOKConTips:
                        ConTips.Invoke(new delegateAddText(viewShowClass.AddTipsOK));
                        break;
                    case R_HomeForm.Button.idSoftWareButton:
                        SoftWareButton.Invoke(new delegateButton(buttonShowClass.ReVersionButton));
                        break;
                    case R_HomeForm.Button.idDDRSizeButton:
                        DDRSizeButton.Invoke(new delegateButton(buttonShowClass.ReDDRButton));
                        break;
                    case R_HomeForm.Button.idFlashSizeButton:
                        FlashSizeButton.Invoke(new delegateButton(buttonShowClass.ReFlashButton));
                        break;
                    case R_HomeForm.Button.idWIFITestButton:
                        WIFITestButton.Invoke(new delegateButton(buttonShowClass.ReWIFIButton));
                        break;
                    case R_HomeForm.Button.idBTTestButton:
                        BTTestButton.Invoke(new delegateButton(buttonShowClass.ReBTButton));
                        break;
                    case R_HomeForm.Button.idUARTTestButton:
                        UARTTestButton.Invoke(new delegateButton(buttonShowClass.ReUARTButton));
                        break;
                    case R_HomeForm.Button.idLEDTestButton:
                        LEDTestButton.Invoke(new delegateButton(buttonShowClass.ReLEDButton));
                        break;
                    case R_HomeForm.Button.idMICTestButton:
                        MICTestButton.Invoke(new delegateButton(buttonShowClass.ReMICButton));
                        break;
                    case R_HomeForm.Button.idAMPTestButton:
                        AMPTestButton.Invoke(new delegateButton(buttonShowClass.ReAMPButton));
                        break;
                    case R_HomeForm.Button.idKeyTestButton:
                        KeyTestButton.Invoke(new delegateButton(buttonShowClass.ReKEYButton));
                        break;
                    case R_HomeForm.Button.idRemoteStartButton:
                        RemoteStartButton.Invoke(new delegateButton(buttonShowClass.ReRemoteStartButton));
                        break;
                    case R_HomeForm.Button.idRemoteLearnButton:
                        RemoteLearnButton.Invoke(new delegateButton(buttonShowClass.ReRemoteLearnButton));
                        break;
                    case R_HomeForm.Button.idCMTLearnButton:
                        cMTLearnClass.IsTestCMT();
                        CMTLearnButton.Invoke(new delegateButton(buttonShowClass.ReCMTLearnButton));
                        break;
                    case R_HomeForm.Button.idZigbeeVersionButton:
                        ZigbeeVersionButton.Invoke(new delegateButton(buttonShowClass.ReZigBeeVersionButton));
                        break;
                    default:
                        break;
                }
            }
    

    3.方法调用

    代码如下:

    ShowButton(R_HomeForm.Button.idConTips);
    

    4.定时器和UI刷新

    定时器方法中调用ShowButton(R_HomeForm.Button.idConTips);会很方便地自动刷新控件,所以我们可以用来监听网络状态,监听设备的状态,当计数器等方面。

    总结

    在面对一个Form中有很多控件要进行刷新操作的时候我们可以用这种方法区封装和调用。

    展开全文
  • 最近做winform页面控件,页面第一次载入或者动态禁用、显示时页面闪烁得很厉害;根据网上说的加页面缓存之类的都没什么用,偶然从外国的一论坛中找到了解决办法,原贴已经找不到了;贴上国外小哥的代码 1 ...

    最近做winform页面控件很多,页面第一次载入或者动态禁用、显示时页面闪烁得很厉害;根据网上说的加页面缓存之类的都没什么用,偶然从外国的一个论坛中找到了解决办法,原贴已经找不到了;贴上国外小哥的代码

    1 protected override CreateParams CreateParams
    2         {
    3             get
    4             {
    5                 CreateParams cp = base.CreateParams;
    6                 cp.ExStyle |= 0x02000000;
    7                 return cp;
    8             }
    9         }

    代码放在窗体的任意位置,其次就是窗体的Opacity属性要设为100%,否则还是会有闪烁。

    转载于:https://www.cnblogs.com/henryzong/p/6209832.html

    展开全文
  • 近期,因工作需要,应用C#设计了一个winform界面,主要是用来实现人员的量化积分管理,类似于很单位的绩效考核管理系统那种。坦言之,这其实只是个人...来个图感受一下首先谈谈关于7个控件的全新感受。Button。bu...
  • 今天在线程环境下测试代码时DataGridView控件报错——DataGridView中发生以下异常:索引13039没有值。而且DataGridView控件刷新很慢,需要用鼠标点击DataGridView控件列标题才刷新。如图所示。 测试代码如下: ...
  • 概述:DevExpress Winforms Controls 内置140多个UI控件和库,完美构建流畅、美观且易于使用的应用程序,本文将为大家介绍如何在DevExpress程序中实现数据展示。DevExpress Winforms Controls 内置140多个UI控件和库...
  • WinForm 上放置的控件多了或者有大背景图,窗体加载时就会闪烁,对于一般的闪烁,设置 DoubleBuffer=True或许有一点改善,要立竿见影的解决可以重载 CreateParams 使用 WS_CLIPCHILDREN 参数初始化窗体,相关的文章...
  • C#winform委托控制事件

    2010-06-17 14:48:31
    怎么控件2个或多个窗口同时执行的事件!页面不刷新很实用的 方法
  • WinForm下的loading框的实现

    千次阅读 2019-02-25 19:52:10
    前言:在项目使用C/S模式情况下,由于需要经常进行数据的刷新,如果直接进行刷新,会有一等待控件重画的过程,非常的不友好,因此在这里添加一loading框进行等待显示。 实现:在经过方面查询资料,终于是实现...
  • 如果想实现页面定时刷新的话,用.net给封装好的updatepanel和timer两个控件实现起来其实挺容易的。这样做加入了很你不能控制的元素,举个例子说就是:用updatepanel后,你设置的样式很有可能就变了,然后你还需要...
  • Winform习惯了,大家都习惯设置datasource... 如果想实现页面定时刷新的话,用.net给封装好的updatepanel和timer两个控件实现起来其实挺容易的。这样做加入了很你不能控制的元素,举个例子说就是:用updatepane...
  •  如果想实现页面定时刷新的话,用.net给封装好的updatepanel和timer两个控件实现起来其实挺容易的。这样做加入了很你不能控制的元素,举个例子说就是:用updatepanel后,你设置的样式很有可能就变了,然后你还...
  • 1)不阻断主线程,实现即时响应,由后台线程完成特定操作2)多个线程,完成同类任务,提高并发性能3)一个任务有多个独立的步骤,多个线程并发执行各子任务,提高任务处理效率 下面我们通过几个小例子做简单介绍。 ...
  • 1)不阻断主线程,实现即时响应,由后台线程完成特定操作2)多个线程,完成同类任务,提高并发性能3)一个任务有多个独立的步骤,多个线程并发执行各子任务,提高任务处理效率 下面我们通过几个小例子做简单介绍。 ...
  • 功能实现:winform界面开发中添加多个pictureBox控件用于显示图片,通过halcon的DispObj方法展示图片 问题描述:通过主窗口传递多个图片到子界面并显示图片,结果图片显示一段时间后会自动刷新为空白 代码: ...
  • 实例220 动态创建多个Button控件 11.2 TextBox控件应用 实例221 制作多行文本框 实例222 制作密码文本框 实例223 在TextBox控件中显示回车符 实例224 只允许输入数字的TextBox控件 实例225 在TextBox控件底端...
  • 实例220 动态创建多个Button控件 11.2 TextBox控件应用 实例221 制作多行文本框 实例222 制作密码文本框 实例223 在TextBox控件中显示回车符 实例224 只允许输入数字的TextBox控件 实例225 在TextBox控件底端...
  • 实例220 动态创建多个Button控件 11.2 TextBox控件应用 实例221 制作多行文本框 实例222 制作密码文本框 实例223 在TextBox控件中显示回车符 实例224 只允许输入数字的TextBox控件 实例225 在TextBox控件底端...
  • winform中,我们可以很轻松的获取动态的系统当前时间,只需加一timer控件就能搞定,但在B/S网站中却不是那么容易,尝试过很方法,但效果都不理想,界面会不停的刷新,才能动态显示系统当前时间。  下面给出...
  • 实例220 动态创建多个Button控件 295 11.2 TextBox控件应用 296 实例221 制作多行文本框 296 实例222 制作密码文本框 297 实例223 在TextBox控件中显示回车符 297 实例224 只允许输入数字的TextBox控件 298 实例225 ...
  • 5.23.1 使用MFC方法定制控件必备的几基本概念 259 5.23.2 定制自定义控件的3种常见方法 260 5.24 Visual C++ 2010 SysLink控件简介与开发 260 5.25 Visual C++ 2010 Split Button控件简介与开发 261 5.26 Visual ...
  • 主要内容有C#开发环境的使用、C#语言基础应用、字符串处理技术、数组和集合的使用、面向对象编程技术、数据结构与算法、Windows窗体基础、特色窗体界面、窗体控制技术、MDI窗体和继承窗体、Windows常用控件的使用、...

空空如也

空空如也

1 2 3
收藏数 45
精华内容 18
关键字:

winform刷新多个控件