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 ...
随机推荐
- windows下matplotlib的安装
在上一篇中我想用matplotlib,无奈一直装不上,就在卸了又装装了又卸,反反复复之后,终于装好了. 初学python,首先就装了numpy,倒也没有多复杂,有需要的朋友可以直接http://sou ...
- Tomcat 优化方案 和 配置详解
转载: http://blog.csdn.net/yi2672379417/article/details/51442229
- Spark入门实战系列
转自:http://www.cnblogs.com/shishanyuan/p/4699644.html 这一两年Spark技术很火,自己也凑热闹,反复的试验.研究,有痛苦万分也有欣喜若狂,抽空把这些 ...
- tp中自定义跳转页面
1.在admin->view下建立public文件夹 2.在public文件夹下建立error.html success.html 3.在项目下公共common ->config.php写 ...
- POJ 3624 Charm Bracelet(01背包模板)
Charm Bracelet Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 45191 Accepted: 19318 ...
- C# Lambda快速深度拷贝
背景:今天上班在班车上和一个同事讨论有关C#拷贝效率的问题,聊到了多种深度拷贝方法,其中就提到了一种Lambda表达式拷贝的方法,这位同事说这种深度拷贝快是快但是如果对象里面再嵌入对象就不能深度拷贝了 ...
- java中的死锁现象
死锁是这样一种情形:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放.由于线程被无限期地阻塞,因此程序不可能正常终止. java 死锁产生的四个必要条件: 1.互斥使用,即当资源被一个线 ...
- pycharm中 unittests in xxxx 运行模式
pycham中 当你运行时 ,使用的 是 Run "unittests in xxxx" 模式时候,if __name__ == '__main__': 后面的代码是不执行的 ...
- python(时间模块,序列化模块等)
一.time模块 表示时间的三种方式: 时间戳:数字(计算机能认识的) 时间字符串:t='2012-12-12' 结构化时间:time.struct_time(tm_year=2017, tm_mon ...
- HDLM命令dlnkmgr详解之四_monitor/offline/online
1. monitor 以一定的时间间隔监控hba或cha口的IO信息. 命令格式 监控hba口的IO信息: dlnkmgr monitor -hbaid HBA_ID [-intvl Interval ...