.Net WinForm学习笔记

1,MDI窗体
设有两个窗体frmMain,frmChild,则:
frmMain:  设IsMdiContainer属性为true
 打开子窗口:
  在相关事件中写如下代码:
  frmChild child=new frmChild();
  child.MdiParent=this;//this表示本窗体为其父窗体
  child.Show();
  在打开子窗体时,如果只允许有一个子窗体,可以加入如下判断:
  if (this.ActiveMdiChild!=null)
  {
     this.ActiveMdiChild.Close(); //关闭已经打开的子窗体
     //....
  }
更改MDI主窗体背景
 先声明一个窗体对象
 private System.Windows.Forms.MdiClient m_MdiClient;
 在Form_Load等事件中,添加如下代码:
 int iCnt=this.Controls.Count;
 for(int i=0;i<iCnt;i++)
 {
 if(this.Controls[i].GetType().ToString()=="System.Windows.Forms.MdiClient")
 {
  this.m_MdiClient=(System.Windows.Forms.MdiClient)this.Controls[i];
  break;
 }
  }
 this.m_MdiClient.BackColor=System.Drawing.Color.Silver;
 具体可参见:http://cnblogs.com/Daview/archive/2004/05/06/8381.aspx

2,创建系统托盘菜单
  2.1,创建一个contextMenu(cmnMain)菜单
  2.2,添加一个NotifyIcon组件,设置ContextMenu属性为cmnMain
  2.3,相应窗体改变事件(最小化等)
   private void frmMain_SizeChanged(object sender,EventArgs e)
   {
      if (this.WindowState==FormWindowState.Minimized)
      {
         this.Hide();
         noiMain.Visible=true;
      }
   }

2.4,相应用户单击系统托盘上contextmenu菜单事件
  private void mniOpen(object sender,EventArgs e)
  {
      noiMain.Visible=false;
      this.Show();
      this.Focus();
  }

2.5,响应用户双击系统托盘图标事件
  private void noiMain_DoubleClick(object s,EventArgs e)
  {
      minOpen.PerformClick(); //相当与mniOpen按钮的单击事件
  }
  **注意添加相应的事件句柄**

3,创建不规则窗体
 3.1,在窗体上创建不规则图象,可以用gdi+绘制,或在图象控件上使用图象填充
 3.2,设置窗体的backcolor为colorA,然后设置TransparencyKey为colorA
 3.3,设置FormBorderStyle为none;

4,创建顶部窗体
  this.TopMost=true;//把窗体的TopMost设置为true

5,调用外部程序

using System.Diagnostics

Process proc=new Process();
  proc.StartInfo.FileName=@"notepad.exe";  //注意路径
  proc.StartInfo.Arguments="";
  proc.Start();

//获得当前目录Directory.GetCurrentDirectory() (using System.IO)

6,Toolbar的使用
  Toolbar控件通常需要imagelist控件结合使用(需要用到其中图标)
  响应Toolbar单击事件处理程序代码:
  switch(ToolbarName.Buttons.IndexOf(e.Button))
  {
      case 0:   //第一个按钮
          //code ...
          break;
      case 1:   //第二个按钮
          //code ...
          break;
      //other case code
      default:  //默认处理,但以上所有项都不符合时
          //code ...
          break;
  }

7,弹出对话框获得相关返回值
  在窗体的closing事件中运行如下代码,可以在用户关闭窗体时询问
  DialogResult result=MessageBox.Show(this,"真的要关闭该窗口吗?","关闭提示",MessageBoxButtons.OKCancel,MessageBoxIcon.Question);
  if (result==DialogResult.OK)
  {
  //关闭窗口
  e.Cancel=false;
  }
  else
  {
  //取消关闭
  e.Cancel=true;
  }

8,打印控件
  最少需要两个控件
  PrintDocument
  PrintPreviewDialog:预览对话框,需要printdocument配合使用,即设置document属性为
                     对应的printDocument
  printdocument的printpage事件(打印或预览事件处理程序)代码,必须.

float fltHeight=0;
 float fltLinePerPage=0;
 long lngTopMargin=e.MarginBounds.Top;
 int intCount=0;
 string strLine;

//计算每页可容纳的行数,以决定何时换页
 fltLinePerPage=e.MarginBounds.Height/txtPrintText.Font.GetHeight(e.Graphics);

while(((strLine=StreamToPrint.ReadLine()) != null) && (intCount<fltLinePerPage))
 {
    intCount+=1;
    fltHeight=lngTopMargin+(intCount*txtPrintText.Font.GetHeight(e.Graphics));
    e.Graphics.DrawString(strLine,txtPrintText.Font,Brushes.Green,e.MarginBounds.Left,fltHeight,new StringFormat());
 }

//决定是否要换页
 if (strLine!=null)
 {
    e.HasMorePages=true;
 }
 else
 {
    e.HasMorePages=false;
 }
  以上代码的StreamToPrint需要声明为窗体级变量:
  private System.IO.StringReader StreamToPrint;

打开预览对话框代码(不要写在printpage事件中)
  StreamToPrint=new System.IO.StringReader(txtPrintText.Text);
  PrintPreviewDialogName.ShowDialog();

9,string对象本质与StringBuilder类,字符串使用
string对象是不可改变的类型,当我们对一个string对象修改后将会产生一个新的string对
象,因此在需要经常更改的字符对象时,建议使用StringBuilder类:
[范例代码]构造一个查询字符串
StringBuilder sb=new StringBuilder("");
sb.Append("Select * from Employees where ");
sb.Append("id={0} and ");
sb.Append("title='{1}'");
String cmd=sb.ToString();

sb=null; //在不再需要时清空它

cmd=String.Format(cmd,txtId.Text,txtTile.Text); //用实际的值填充格式项

判断字符串是否为空:
检查一个字符串是否为空或不是一个基本的编程需要,一个有效的方法是使用string类的Length属性来取代使用null或与""比较。

比较字符串:使用String.Equals方法来比较两个字符串
string str1="yourtext";
if (str1.Equals("TestSting") )
{
  // do something
}

10,判断某个字符串是否在另一个字符串(数组)中
 需要用到的几个方法
 string.Split(char);//按照char进行拆分,返回字符串数组
 Array.IndexOf(Array,string):返回指定string在array中的第一个匹配项的下标
 Array.LastIndexOf(Array,string):返回指定string在array中的最后一个匹配项的下标
 如果没有匹配项,则返回-1
 [示例代码]:
 string strNum="001,003,005,008";
 string[] strArray=strNum.Split(',');//按逗号拆分,拆分字符为char或char数组
 
 Console.WriteLine(Array.IndexOf(strArray,"004").ToString());

11,DataGrid与表和列的映射
从数据库读取数据绑定到DataGrid后,DataGrid的列标头通常跟数据库的字段名相同,如果
不希望这样,那么可以使用表和列的映射技术:
using System.Data.Common;

string strSql="select * from Department";
OleDbDataAdapter adapter=new OleDbDataAdapter(strSql,conn);

DataTableMapping dtmDep=adapter.TableMappings.Add("Department","部门表");

dtmDep.ColumnMappings.Add("Dep_Id","部门编号");
dtmDep.ColumnMappings.Add("Dep_Name","部门名称");

DataSet ds=new DataSet();

adapter.Fill(ds,"Department"); //此处不能用"部门表"

响应单击事件(datagrid的CurrentCellChanged事件)
DataGridName.CurrentCell.ColumnNumber;//所单击列的下标,从0开始,下同
DataGridName.CurrentCell.RowNumber;//所单击行的下标
DataGridName[DataGridName.CurrentCell];//所单击行和列的值

DataGridName[DataGridName.CurrentRowIndex,n].ToString();//获得单击行第n+1列的值

12,动态添加菜单并为其添加响应事件
 添加顶级菜单:
 MainMenuName.MenuItems.Add("顶级菜单一");//每添加一个将自动排在后面

添加次级菜单:
 MenuItem mniItemN=new MenuItem("MenuItemText")
 MenuItem mniItemN=new MenuItem("MenuItemText",new EventHandler(EventDealName))
 MainMenuName.MenuItems[n].MenuItems.Add(mniItemN);//n为要添加到的顶级菜单下标,从0开始

创建好菜单后添加事件:
 mniItemN.Click+=new EventHandler(EventDealName);

也可以在添加菜单的同时添加事件:
 MenuItem mniItemN=new MenuItem("MenuItemText",new EventHandler(EventDealName));
 MainMenuName.MenuItems[n].MenuItems.Add(mniItemN);

13,正则表达式简单应用(匹配,替换,拆分)
 using System.Text.RegularExpressions;

//匹配的例子
 string strRegexText="你的号码是:020-32234102";
 string filter=@"\d{3}-\d*";

Regex regex=new Regex(filter);
 Match match=regex.Match(strRegexText);

if (match.Success) //判断是否有匹配项
 {
     Console.WriteLine("匹配项的长度:"+match.Length.ToString());
     Console.WriteLine("匹配项的字符串:"+match.ToString());
     Console.WriteLine("匹配项在原字符串中的第一个字符下标:"+match.Index.ToString());
 }
 
 //替换的例子
 string replacedText=regex.Replace(strRegexText,"020-88888888");
 Console.WriteLine(replacedText);//输出"你的号码是:020-88888888"

//拆分的例子
 string strSplitText="甲020-32654已020-35648丙020-365984";
 foreach(string s in regex.Split(strSplitText))
 {
    Console.WriteLine(s); //依次输出"甲乙丙"
 }

13,多线程简单编程
 using System.Threading;

Thread ThreadTest=new Thread(new ThreadStart(ThreadCompute));
 ThreadTest.Start();//使用另一个线程运行方法ThreadCompute
 
 ThreadCompute方法原型:
 private void ThreadCompute()
 {}

14,操作注册表
using System.Diagnostics;
using Microsoft.Win32;
  //操作注册表
  RegistryKey RegKey=Registry.LocalMachine.OpenSubKey("Software",true);

//添加一个子键并给他添加键值对
  RegistryKey NewKey=RegKey.CreateSubKey("regNewKey");
  NewKey.SetValue("KeyName1","KeyValue1");
  NewKey.SetValue("KeyName2","KeyValue2");

//获取新添加的值
  MessageBox.Show(NewKey.GetValue("KeyName1").ToString());

//删除一个键值(对)
  NewKey.DeleteValue("KeyName1");

//删除整个子键
  RegKey.DeleteSubKey("regNewKey");

引用:https://www.cnblogs.com/jxsoft/archive/2011/04/28/2032053.html

C#.Net WinForm学习笔记的更多相关文章

  1. winform学习笔记02

    Hashtable 数据遍历的几种方式 ---Hashtable 在集合中称为键值对,它的每一个元素的类型是 DictionaryEntry,由于Hashtable对象的键和值都是Object类型,决 ...

  2. winform学习笔记-文档路径

    获取应用程序路径 //获取当前进程的完整路径,包含文件名(进程名).string str = this.GetType().Assembly.Location;result: X:\xxx\xxx\x ...

  3. Winform学习手册(目录)

    一.基础: WINFORM学习笔记——创建Winform项目 WINFORM学习手册——TextBox.Lable.Button WINFORM学习笔记——窗体生命周期 WINFORM学习手册——对话 ...

  4. BOLT.NET 学习笔记(一) 开篇 用.net winform 快速开发 炫酷的界面

    BOLT.NET 学习笔记(一) 开篇 用.net winform 快速开发 炫酷的界面 bolt 基本介绍 Bolt界面引擎是迅雷公司从2009年开始开发的第四代界面库.迅雷7是首个采用该引擎成功开 ...

  5. sql server 关于表中只增标识问题 C# 实现自动化打开和关闭可执行文件(或 关闭停止与系统交互的可执行文件) ajaxfileupload插件上传图片功能,用MVC和aspx做后台各写了一个案例 将小写阿拉伯数字转换成大写的汉字, C# WinForm 中英文实现, 国际化实现的简单方法 ASP.NET Core 2 学习笔记(六)ASP.NET Core 2 学习笔记(三)

    sql server 关于表中只增标识问题   由于我们系统时间用的过长,数据量大,设计是采用自增ID 我们插入数据的时候把ID也写进去,我们可以采用 关闭和开启自增标识 没有关闭的时候 ,提示一下错 ...

  6. 2014年暑假c#学习笔记目录

    2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...

  7. C#可扩展编程之MEF学习笔记(一):MEF简介及简单的Demo

    在文章开始之前,首先简单介绍一下什么是MEF,MEF,全称Managed Extensibility Framework(托管可扩展框架).单从名字我们不难发现:MEF是专门致力于解决扩展性问题的框架 ...

  8. 学习笔记:利用GDI+生成简单的验证码图片

    学习笔记:利用GDI+生成简单的验证码图片 /// <summary> /// 单击图片时切换图片 /// </summary> /// <param name=&quo ...

  9. C# async await 学习笔记2

    C# async await 学习笔记1(http://www.cnblogs.com/siso/p/3691059.html) 提到了ThreadId是一样的,突然想到在WinForm中,非UI线程 ...

  10. .NET Remoting学习笔记(一)概念

    目录 .NET Remoting学习笔记(一)概念 .NET Remoting学习笔记(二)激活方式 .NET Remoting学习笔记(三)信道 背景 自接触编程以来,一直听过这个名词Remotin ...

随机推荐

  1. python基础安装虚拟环境

    1.pip install virtualenv或者pip3 install virtualenv 2.在要存放虚拟环境的地方创建一个venv文件夹,用来存放所有创建的虚拟环境,方便查找与管理 3.m ...

  2. 服务网关ZUUL过滤器

    过滤器两个功能: 1.其中路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础: 2.过滤器功能则负责对请求的处理过程进行预干预,是实现请求校验.服务聚合等功能的基础. 有4类 ...

  3. 面试官:说说volatile底层实现原理?

    在 Java 并发编程中,有 3 个最常用的关键字:synchronized.ReentrantLock 和 volatile. 虽然 volatile 并不像其他两个关键字一样,能保证线程安全,但 ...

  4. 【Azure Spring Cloud】Java Spring Cloud 应用部署到Azure上后,发现大量的 java.lang.NullPointerException: null at io.lettuce.core.protocol.CommandHandler.writeSingleCommand(CommandHandler.java:426) at ... 异常

    Azure Spring Cloud 是什么? 借助 Azure Spring Cloud,可以轻松地将 Spring Boot 微服务应用程序部署到 Azure,不需更改任何代码. 该服务管理 Sp ...

  5. Java 基本数据类型之间的运算规则

    1 /*** 2 * 基本数据类型之间的运算规则 3 * 4 * 前提:7中基本数据类型运算 5 * 6 * 1.自动类型提升: 7 * 当容量小的类型与容量大的数据类型的变量做运算时,结果自动提升为 ...

  6. FreeRTOS教程3 中断管理

    1.准备材料 正点原子stm32f407探索者开发板V2.4 STM32CubeMX软件(Version 6.10.0) Keil µVision5 IDE(MDK-Arm) 野火DAP仿真器 XCO ...

  7. idea editor tabs 标题头 多行显示,全部显示出来 (vscode也放一个)

  8. 软件发布时 生成发布日志文件 单点登录 getGitInfo.bat

    需求 每次发包的时候,前端是3个包,如果后期出现问题,不好回查 所以把当前项目的git信息记录下来 以便回查 第一次手动写了下,发现比较麻烦,所以写个脚本,每次发布的时候 运行下即可 上代码 软件发布 ...

  9. 写了一个 dict.cn 的油猴脚本,目的是通过url进行搜索。这样就能配合wox进行单词的搜索了。

    写了一个 dict.cn 的油猴脚本,目的是通过url进行搜索.这样就能配合wox进行单词的搜索了. // ==UserScript== // @name dict.cn // @namespace ...

  10. linux中ping命令停不下来解决方案

    linux的 ping 命令和windows不一样.windows默认只发送四个包的. 你可以使用ping -c 4 [ip/域名]这种方式来实现你想要的. linux控制台程序一般强制终止都是Ctr ...