Visual studio之C#的一些常见问题
背景
要写一个APP,APP通过串口控制下位机,在此记录C#的一些常用控件的使用办法。
正文
- 单击button控件,执行对应操作。
选择要操作的button控件,在属性栏内点击类似闪电标志一样的事件
,找到操作
,选择Click
,双击,即会在主程序中生成对应的单击事件处理代码,如下所示:
private void Combtn_Click(object sender, EventArgs e)
{
// 单击按键即会执行该段代码
Button Combtn = (Button)sender;
Combtn.Text = "按钮按下";
}
Sender
代表触发事件的那个控件,此处,Sender
既是按钮,如上所示,将Sender
赋值给正确类型的对象,即可实现对Button控件的操作。
e
则代表该事件传入的参数。此处没有使用,在竹影青瞳的博客关于(object sender, EventArgs e)中已做了详细介绍。
- C#中声明全局变量
首先,建立一个空的类GloableVar
,在该空类声明各种全局变量,一定要声明为public
,并且变量为static
,这个static
是关键!类我们可以理解为声明了一个群体类型,但是该类型不占用实际空间,就相当于char``int
等关键词,但是在该类内参数加上了static
,既对该类对应的参数分配了实际空间,这样我们就模拟实现了全局变量的效果。代码如下:
namespace Lazercontrol
{
public class GloableVar
{
public static bool lazerstate;
// 此变量的调用办法,既直接类名GloableVar.lazerstate即可。
}
}
若是需要声明一个全局的类变量,而不是单个变量,那就需要先new一个该类即可,如下:
namespace Lazercontrol
{
public class GloableVar
{
public static SerialPort serialPort1; // class SerialPort
}
}
// 在初始化函数内,new一个变量
private void InitializeSerial()
{
GloableVar.serialPort1 = new SerialPort();
// new一个变量
// 调用方法
GloableVar.serialPort1.PortName = "COM1";
}
加了static后,new的实体保存在栈
里,之后再new任何次,实体不变,就这一个。
未加static,则new的实体保存在堆
里,之后每new一次,会生成一个新的实体。
此处感谢曾老师的C#技术支持。(手动阴笑)
- 单击按键打开新的窗体
首先,创建一个新窗体,方法为,右击项目名称点击添加
,Windows窗体
,重命名名称即可,此处名称为Comsetting
。接着在主窗体内实例化窗体,代码如下:
namespace Lazercontrol
{
public partial class Mainwin : Form
{
ComSetting comwin; // 实例化ComSetting窗口
public Mainwin()
{
InitializeComponent();
}
// ```其他代码省略
}
}
按照1
方法,进入到按键触发处理函数中,将窗口实例化,然后调用show()函数,打开新窗体,代码如下:
private void Combtn_Click(object sender, EventArgs e)
{
Button ComBtn = (Button)sender;
comwin = new ComSetting();
comwin.ShowDialog();
// 打开的窗体关闭后,才能操作其他窗体
// 也可以是comwin.Show();,这个就没有限制
}
- C#控件大小随窗体大小等比例变化
参考天黑不熄灯的博客园的博客C#控件大小随窗体大小等比例变化。
** 定义全局变量
private float X;//当前窗体的宽度
private float Y;//当前窗体的高度
** 功能函数setControls
//根据窗体大小调整控件大小
private void setControls(float newx, float newy, Control cons)
{
//遍历窗体中的控件,重新设置控件的值
foreach (Control con in cons.Controls)
{
string[] mytag = con.Tag.ToString().Split(new char[] { ':' });//获取控件的Tag属性值,并分割后存储字符串数组
float a = System.Convert.ToSingle(mytag[0]) * newx;//根据窗体缩放比例确定控件的值,宽度
con.Width = (int)a;//宽度
a = System.Convert.ToSingle(mytag[1]) * newy;//高度
con.Height = (int)(a);
a = System.Convert.ToSingle(mytag[2]) * newx;//左边距离
con.Left = (int)(a);
a = System.Convert.ToSingle(mytag[3]) * newy;//上边缘距离
con.Top = (int)(a);
Single currentSize = System.Convert.ToSingle(mytag[4]) * newy;//字体大小
con.Font = new Font(con.Font.Name, currentSize, con.Font.Style, con.Font.Unit);
if (con.Controls.Count > 0)
{
setControls(newx, newy, con);
}
}
}
** 在窗体的Load事件中添加
private void Form1_Load(object sender, EventArgs e)
{
X = this.Width;//获取窗体的宽度
Y = this.Height;//获取窗体的高度
setTag(this);//调用方法
}
** 在窗体的Resize事件中添加
private void Form1_Resize(object sender, EventArgs e)
{
float newx = (this.Width) / X; //窗体宽度缩放比例
float newy = (this.Height) / Y;//窗体高度缩放比例
setControls(newx, newy, this);//随窗体改变控件大小
}
注意:窗体属性内MaximizeBox
要设置为true
。
C#窗体全屏功能
参考jack_Meng的博客C#窗体全屏功能。设置窗口当用户按
Enter
时,所单击的窗体的按钮
在窗体的load事件中,添加如下代码:
private void Mainwin_Load(object sender, EventArgs e)
{
this.AcceptButton = Yourbutton_name;
}
也可在窗体属性内找到Accecptbutton
,选择对应button按键的ID。
设置书签
按下组合键Ctrl
+F2
设置书签,再按组合键Ctrl
+F2
消除书签;按下F2
跳转到下一个书签,按下Shift
+F2
跳转到上一个书签。显示行号
点击工具
-->选项
-->文本编辑器
-->C#
-->勾选行号
。switch() {case CONST: break;}
语句中,case后面的常量表达方法
在C/C++中,switch() {case CONST: break;}
语句中的CONST
常常使用宏定义来定义,但在C#中却没有宏定义,所以可以用C#的enum
来解决,也可以用const常量来表示,举例, case两种值,0xF0
/0x0F
,分别为MOD1/MODE2,若直接用数字表示则不太直观,所以用const来替代,代码如下:
const byte MODE1 = 0xF0; //注意常量声明为 byte
const byte MODE1 = 0x0F;
switch(Mode)
{
case MODE1:
break;
case MODE2:
break;
}
- 多个非UI线程如何访问UI控件而不被报异常
在多线程程序中,新创建的线程不能访问UI线程创建的窗口控件,如果需要访问窗口中的控件,可以在窗口构造函数中将CheckForIllegalCrossThreadCalls设置为 false,即将将禁止跨线程访问的检查
禁能,即允许多线程访问UI控件,这个会造成无端的错误,因此不推荐使用,可以参考此篇博客C# 跨线程调用控件,
// 跨线程访问不被检查
Control.CheckForIllegalCrossThreadCalls = false;
参考于多线程中使用CheckForIllegalCrossThreadCalls = false访问窗口;
11.
参考链接
- 竹影青瞳的博客关于(object sender, EventArgs e);
- 百度经验c# 通过按钮控件实现窗口间的跳转;
- 天黑不熄灯的博客园的博客C#控件大小随窗体大小等比例变化;
- jack_Meng的博客C#窗体全屏功能。
- bomo的博客多线程中使用CheckForIllegalCrossThreadCalls = false访问窗口;
不定期更新
记录时间:2017-4-7
记录地点:深圳WZ
Visual studio之C#的一些常见问题的更多相关文章
- Visual Studio中C++项目编译常见问题总结
1. 工程引用外部头文件 工程->属性->配置属性->C/C++ ->常规->附加包含目录:输入头文件存放目录 2. 添加lib库引用 添加lib库的路径:工程-> ...
- Visual studio之C#的一些常见问题01switch case常量
switch() {case CONST: break;}语句中,case后面的常量表达方法在C/C++中,switch() {case CONST: break;}语句中的CONST常常使用宏定义来 ...
- 用于 Visual Studio 和 ASP.NET 的 Web 应用程序项目部署常见问题
https://msdn.microsoft.com/zh-cn/library/ee942158(v=vs.110).aspx#can_i_exclude_specific_files_or_fol ...
- Visual Studio 2008常见问题
1.asp.net在什么软件上运行?学习asp往往需要测试asp程序,电脑不能直接测试,需要装IIS才能运行,但装IIS要么需要安装盘,要么需要安装包,而且设置也很复搜索杂.这里给大学推荐两个替代II ...
- Visual Studio 开发(三):Visual Studio 使用时常见问题解决方案
一.Error LNK2019: 无法解析的外部符号 此问题应该是Visual Studio的初学者最常碰到的问题,也是相对来说很让人头疼的问题. 注:Error LNK2019 问题在VC 6.0 ...
- visual studio 2015 开发时常见问题的解决方案
1.visual studio 2015 用printf函数打印时来不及看结果窗口就关闭 方案一 在所写的代码后面,加上system("PAUSE"); 如下:
- Visual Studio Code 配置指南
Visual Studio Code (简称 VS Code)是由微软研发的一款免费.开源的跨平台文本(代码)编辑器.在我看来它是「一款完美的编辑器」. 本文是有关 VS Code 的特性介绍与配置指 ...
- 在Visual Studio 2012中使用VMSDK开发领域特定语言(二)
本文为<在Visual Studio 2012中使用VMSDK开发领域特定语言>专题文章的第二部分,在这部分内容中,将以实际应用为例,介绍开发DSL的主要步骤,包括设计.定制.调试.发布以 ...
- 安装Visual Studio 2013 出现0x80070643错误
安装Visual Studio 2013 没一会就出现问题:安装.net framework4.5.1出现严重错误.点击常见问题和解决方案的链接和日志文件,日志里说是0x80070643类型的错误,在 ...
随机推荐
- OpenCV 学习之路(2) -- 操作像素
本节内容: 访问像素值 用指针扫描图像 用迭代器扫描图像 编写高效的图像扫描循环 扫描图像并访问相邻像素 实现简单的图像运算 图像重映射 访问像素值 准备工作: 创建一个简单函数,用它在图像中加入椒盐 ...
- 【UOJ #179】线性规划 单纯形模板
http://uoj.ac/problem/179 终于写出来了单纯性算法的板子,抄的网上大爷的qwq 辅助线性规划找非基变量时要加个随机化才能A,我也不知道为什么,卡精度吗? 2017-3-6UPD ...
- ARC-100 D - Equal Cut
题面在这里! 我们枚举一下第2和第3段的分界点,显然这种情况下 第1与第2 和 第3与第4 之间的分界点都只有两种情况可能最优,吧这四种情况讨论一下就好了. 两边的分界点可以单调扫过去... # ...
- CodeForces - 992D Nastya and a Game
题面在这里! 显然一段区间的 mul - sum * k = 0 才合法,然鹅我们发现sum * k 对于本题的数据来说最大才是1e18,也就是说mul必须得<=1e18. 我们不妨从这里入手, ...
- BZOJ 3437 小P的牧场(斜率优化DP)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3437 [题目大意] n个牧场排成一行,需要在某些牧场上面建立控制站, 每个牧场上只能建 ...
- 【Huffman树贪心+优先队列】POJ3253-Fence Repair
思路详见之前的贪心专题,用优先队列来代替之前的插入排序,效率为O(nlogn) #include<iostream> #include<cstdio> #include< ...
- 【单调队列】POJ2823-Sliding Window
单调队列经典题之一. [思路] 设置两个单调队列分别记录最大值和最小值.对于每一个新读入的数字,进行两次操作(对于求最大值和最小值中的某一个而言),一是若队首不在滑窗范围内则删去:二是删去队末比当前值 ...
- 鹦鹉学舌1——C语言初学者百题大战之三
#include<stdio.h> int main() { int a; scanf("%d",&a); printf("%d",a-a+ ...
- Unity 3D 之Playerprefs
Unity3d提供了一个用于本地持久化保存与读取的类——PlayerPrefs.工作原理非常简单,以键值对的形式将数据保存在文件中,然后程序可以根据这个名称取出上次保存的数值. 一.PlayerPre ...
- JS操作小数运算,结果莫名其妙出现多位小数问题
Number类型: Number类型是ECMAScript中最常用和最令人关注的类型了:这种类型使用IEEE754格式来表示整数和浮点数值(浮点数值在某些语言中也被成为双精度数值),为支持各种数据类型 ...