WinForm(C#)相关知识和经验的碎片化记录
1、引发类型为“System.Windows.Forms.AxHost+InvalidActiveXStateException”的异常
出现"System.Windows.Forms.AxHost+InvalidActiveXStateException"异常多是引用第三方控件引起的。在NEW时,需要初始化该对象。
AxESACTIVEXLib.AxESActiveX ax = new AxESACTIVEXLib.AxESActiveX(); ((System.ComponentModel.ISupportInitialize)(this.ax)).BeginInit();
this.Controls.Add(ax);
((System.ComponentModel.ISupportInitialize)(this.ax)).EndInit();
注意:该解决方法的使用有待商榷,发现用这种方法会影响界面其它控件的显示。
2、PictureBox控件的Image属性显示网络图片
PictureBox1.Image = Image.FromStream(WebRequest.Create("https://www.baidu.com/img/bd_logo1.png").GetResponse().GetResponseStream());
3、事件的注册与注销的问题
某事件被多次注册时,那么该事件也将会多次触发,其对应的事件处理函数也将被多次调用。
g_kyTTS.SpeakCompletedFlagChanged += new KyTTS.SpeakCompletedFlagChangedEventHandler(g_kyTTS_SpeakCompletedFlagChanged); //注册事件
所以,注册事件后应该要考虑到在合适的地方进行事件的注销
g_kyTTS.SpeakCompletedFlagChanged -= new KyTTS.SpeakCompletedFlagChangedEventHandler(g_kyTTS_SpeakCompletedFlagChanged); //注销事件
4、通过正则表达式获取英文句子字符串中的英文单词数
MatchCollection mc = Regex.Matches("Hello,World!", @"\d+.\d+|\w+");
int l_nSenWordCnt = mc.Count; //英文句子的单词数
5、播放嵌入到资源文件(.resx)的音频
SoundPlayer 类提供了加载和播放 .wav 文件的简单界面。SoundPlayer 类支持从文件路径、URL、包含 .wav 文件的 Stream 或包含 .wav 文件的嵌入资源中加载 .wav 文件。
System.Media.SoundPlayer simpleSound = new System.Media.SoundPlayer(Properties.Resources.ResourceManager.GetStream("Du"));
simpleSound.Play();
6、文件(夹)上传到ftp时,出现“远程服务器返回错误: (550) 文件不可用(例如,未找到文件,无法访问文件)”异常
可能是如下原因:
(1)、URL路径不对,看看有没有多加空格,或者大小写问题;
(2)、权限是否足;
(3)、需要反复连接的时候,如GetFileList,需要递归获得所有文件,keepAlive则设成false,一个查询请求完了后就关闭。
7、跨线程访问控件的属性时,出现“线程间操作无效: 从不是创建控件“XXX”的线程访问它”异常
产生原因:
如果从非创建这个控件的线程中访问这个控件或者操作这个控件的话就会抛出这个异常。访问 Windows 窗体控件本质上不是线程安全的。如果有两个或多个线程操作某一控件的状态,则可能会迫使该控件进入一种不一致的状态。还可能出现其他与线程相关的bug,包括争用情况和死锁。确保以线程安全方式访问控件非常重要。
解决办法:
(1)、通过设置System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;来解决,在程序初始化的时候设置这个属性,而且使用的控件都是微软.Net Framework类库中的控件。
(2)、利用委托
delegate void SetTextCallBack(string text);
private void SetText(string text)
{
if (this.txt_a.InvokeRequired)
{
SetTextCallBack stcb = new SetTextCallBack(SetText);
this.Invoke(stcb , new object[] { text});
}
else
{
this.txt_a.Text = text;
}
}
private void LoadData()
{
SetText("测试");
}
//窗体加载时,用线程加载数据
private void Frm_ImportManager_Load(object sender, EventArgs e)
{
ThreadStart ts = new ThreadStart(LoadData);
Thread thread = new Thread(ts);
thread.Name = "LoadData";
thread.Start();
}
(3)、使用BackgroundWorker控件
// This event handler starts the form's
// BackgroundWorker by calling RunWorkerAsync.
//
// The Text property of the TextBox control is set
// when the BackgroundWorker raises the RunWorkerCompleted
// event.
private void setTextBackgroundWorkerBtn_Click(object sender,EventArgs e)
{
this.backgroundWorker1.RunWorkerAsync();
}
// This event handler sets the Text property of the TextBox
// control. It is called on the thread that created the
// TextBox control, so the call is thread-safe.
//
// BackgroundWorker is the preferred way to perform asynchronous
// operations.
private void backgroundWorker1_RunWorkerCompleted(object sender,RunWorkerCompletedEventArgs e)
{
this.textBox1.Text = "This text was set safely by BackgroundWorker.";
}
参考博文:http://www.cnblogs.com/luckboy/archive/2010/12/19/1910785.html
8、判断事件是否已经被注册过
用反射取出事件绑定的委托实例,然后用GetInvocationList就可以得到所有注册的方法了。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Reflection;
namespace WA
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent(); this.Load+=new EventHandler(Form1_Load1);
this.Load+=new EventHandler(Form1_Load2); PropertyInfo propertyInfo = (typeof(Form)).GetProperty("Events", BindingFlags.Instance | BindingFlags.NonPublic);
EventHandlerList eventHandlerList = (EventHandlerList)propertyInfo.GetValue(this, null);
FieldInfo fieldInfo = (typeof(Form)).GetField("EVENT_LOAD", BindingFlags.Static | BindingFlags.NonPublic); Delegate d = eventHandlerList[fieldInfo.GetValue(null)]; if (d != null)
{
foreach (Delegate de in d.GetInvocationList())
Console.WriteLine(de.Method.Name);
}
}
private void Form1_Load1(object sender, EventArgs e)
{
//TODO
}
private void Form1_Load2(object sender, EventArgs e)
{
//TODO
}
}
}
------------------------------------------------------2016-06-29------------------------------------------------------
9、控件的层次显示问题
//a在上
Controls.Add(a);
Controls.Add(b);
// b在上
Controls.Add(b);
Controls.Add(a);
10、窗体添加到容器控件中去
Form g_std = new Form();
g_std.TopLevel = false;
panel1.Controls.Add(g_std);
不能显示为模式窗体,既不能这样:
g_std.show(panel1);
------------------------------------------------------2016-08-25------------------------------------------------------
11、将.resx文件中的文件流写入系统临时文件夹
using System.IO;
/// <summary>
/// 将音频资源文件写入系统临时文件夹
/// </summary>
/// <returns></returns>
private string WriteDuResToSysTempFolder()
{
string l_sTempPath = Path.GetTempPath(); //临时文件夹
string l_sAudioFileName = l_sTempPath + "Du.wav"; //临时文件夹下的文件 //先判断文件是否存在(如果不存在,将其写入临时文件夹)
if (!File.Exists(l_sAudioFileName))
{
//把资源里的音频文件变为字节数组
byte[] buf = StreamToBytes(Properties.Resources.Du);
//写到临时文件里面
File.WriteAllBytes(l_sAudioFileName, buf);
} return l_sAudioFileName;
}
/// <summary>
/// 将 Stream 转成 byte[]
/// </summary>
/// <param name="stream"></param>
/// <returns></returns>
private byte[] StreamToBytes(Stream stream)
{
byte[] bytes = new byte[stream.Length];
stream.Read(bytes, , bytes.Length);
// 设置当前流的位置为流的开始
stream.Seek(, SeekOrigin.Begin);
return bytes;
}
......
WinForm(C#)相关知识和经验的碎片化记录的更多相关文章
- React相关知识和经验的碎片化记录
React相关知识和经验的碎片化记录 1.Warning: validateDOMNesting(...): Whitespace text nodes cannot appear as a chil ...
- 开发工具Visual Studio使用相关知识和经验的碎片化记录
开发工具Visual Studio使用相关知识和经验的碎片化记录 1.Visual Studio提示"无法启动IIS Express Web服务器"的解决方法 有时,在使用Visu ...
- HTML相关知识和经验的碎片化记录
1.标签input在type="file"时,name是必须属性 <form id="MainFileUpload" name="MainFil ...
- windows cmd命令相关知识和经验的碎片化记录
1.循环遍历当前文件夹下的所有*.dll文件,并打印其绝对路径和相对路径 ``` for /f "tokens=*" %%a in ('dir /s/b/a-d "*.d ...
- IIS相关知识和经验的碎片化记录
1.IIS(Internet Information Services)网站本机可以访问,局域网其他机器无法访问 导致这个问题之一是防火墙规则,解决办法如下: [开始]打开[控制面板],选择[WIND ...
- AngularJs(v1)相关知识和经验的碎片化记录
1.利用angular指令监听ng-repeat渲染完成后执行脚本 http://www.cnblogs.com/wangmeijian/p/5141266.html 2.$http的POST请求中请 ...
- Asp.net相关知识和经验的碎片化记录
1.解决IIS7.0下“HTTP 错误 404.15 - Not Found 请求筛选模块被配置为拒绝包含的查询字符串过长的请求”问题 方案1:在程序的web.config中system.web节点里 ...
- SQL Server相关知识和经验的碎片化记录
1.在向服务器发送请求时发生传输级错误 在向服务器发送请求时发生传输级错误. (provider: TCP 提供程序, error: 0 - 远程主机强迫关闭了一个现有的连接.) ---> Sy ...
- JavaScript相关知识和经验的碎片化记录
1.JavaScript提示“未结束的字符串常量”错误解决方法 1.1 JavaScript引用时,使用的字符语言不一致. 比如:<script type=”text/javascript ...
随机推荐
- 使用visio 2010建立sql server数据模型——手动画、利用逆向工程
基础数据库这个词不在新鲜,老早就提出了.咱们从出生,个人信息就被放到一个基本信息库中了,在全国各地,通过身份证号就能知道你的基本信息.最近米老师 下发了一个任务,让我们开发几个小项目,考试系统.选修课 ...
- UVA - 1602 Lattice Animals (暴力+同构判定)
题目链接 题意:求能放进w*h的网格中的不同的n连通块个数(通过平移/旋转/翻转后相同的算同一种),1<=n<=10,1<=w,h<=n. 刘汝佳的题真是一道比一道让人自闭.. ...
- 修改Linux安装软件镜像源为阿里云
CentOS系统更换软件安装源: 第一步:安装wget.如果你的系统已安装了wget可以直接跳到下一步. [root@local~]#yum install wget 第二步:备份你的原镜像文件,避免 ...
- (C#)Windows Shell 外壳编程系列5 - 获取图标
(本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢-) 接上一节:(C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令 有 ...
- 推荐几本学习MySQL的好书
转载:http://mingxinglai.com/cn/2015/12/material-of-mysql/ 我这里推荐几本MySQL的好书,应该能够有效避免学习MySQL的弯路,并且达到一个不错的 ...
- hdu 4336 Card Collector —— Min-Max 容斥
题目:http://acm.hdu.edu.cn/showproblem.php?pid=4336 bzoj 4036 的简单版,Min-Max 容斥即可. 代码如下: #include<cst ...
- docker容器升级脚本
#!/bin/bash # Let's finish it like a flash # usage:sh -x update_cms_backend.sh -v 2018050401 ARGS=`g ...
- 【转】 Pro Android学习笔记(八七):了解Handler(1):组件和线程
目录(?)[-] 主线程消息队列和线程池 查看线程信息 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingf ...
- Java-API:java.util.ArrayList
ylbtech-Java-API:java.util.ArrayList 1.返回顶部 2.返回顶部 3.返回顶部 4.返回顶部 5.返回顶部 0. https://docs.orac ...
- 关于64位操作系统使用C#访问注册表失败的问题
通过C#的注册表类 Registry.GetValue 进行访问时,其返回值一直为空.然后认真检查检查再检查了注册表路径,发现路径没有一点问题,不说废话,上代码: if (Registry.GetVa ...