C#一些用法
C#一些用法
关于 WPF 在主窗口中用多线程打开的子窗口关闭后进程还存在,这个问的题的解决方法。
this.Dispatcher.Thread.Abort()
程序退出的方法:
- this.Close(); 只是关闭当前窗口,若不是主窗体的话,是无法退出程序的,另外若有托管线程(非主线程),也无法干净地退出;
- Application.Exit(); 强制所有消息中止,退出所有的窗体,但是若有托管线程(非主线程),也无法干净地退出;
- Application.ExitThread(); 强制中止调用线程上的所有消息,同样面临其它线程无法正确退出的问题;
- System.Environment.Exit(0); 这是最彻底的退出方式,不管什么线程都被强制退出,把程序结束的很干净。
C#的引用
class RefExample { static void Method(ref int i) { // Rest the mouse pointer over i to verify that it is an int. // The following statement would cause a compiler error if i // were boxed as an object. i = i + 44; } static void Main() { int val = 1; Method(ref val); Console.WriteLine(val); // Output: 45 } }
窗口类:
关闭窗口:this.Close(); 隐藏窗口:this.Hide();
弹出新的窗口后,能对原窗口操作:Show();
弹出新的窗口后,不能对原窗口操作:ShowDialog(); 弹出信息的小窗口: MessageBox.Show("信息"); c# form点击X退出程序
属性中,双击FormClosing添加事件,在函数中写:
Application.Exit();
textBox的一些用法:' textBox2.Text = "sda"; // 把字符串显示在文本中 在C#中把textBox置为密码框,可以直接在属性的行为的passwordChar置为* String spass = textBox2.Text; // 得到文本中字符串 Application.Exit(); // 关闭所有界面 C# ListView用法详解 http://blog.csdn.net/czw2010/article/details/7910324 以下为简单的应用: ListView_commuData.View = View.Details;//显示表头 ListView.gridlines = true;//显示网格线 listView1.View = View.Details; // 显示表头 listView1.GridLines = true; // 显示网格线 int per = 100; // 列宽 listView1.Columns.Add("课程编号", per, HorizontalAlignment.Center); listView1.Columns.Add("课程名称", per, HorizontalAlignment.Center); listView1.Columns.Add("任课教师", per, HorizontalAlignment.Center); listView1.Columns.Add("学分", per, HorizontalAlignment.Center); SqlConnection con = new SqlConnection("server= (local);uid=sa;pwd=密码;database=数据库名"); con.Open(); SqlCommand cmd = con.CreateCommand(); cmd.CommandText = "SQL语句"; SqlDataReader rs = cmd.ExecuteReader(); // 查询的SQL语句 while (rs.Read()) { String[] s = new String[4]; for(int i=0;i<4;i++) s[i] = String.Format("{0}", rs[i]); // 取出第几列元素 ListViewItem lvi = new ListViewItem(); lvi.Text = s[0]; for(int i=1;i<4;i++) lvi.SubItems.Add(s[1]); listView1.Items.Add(lvi); } con.Close(); cmd.ExecuteNonQuery(); // 插入,更新,删除操作,返回的是影响的行数 数据库进行连接: 命名空间: using System.Data.SqlClient; // 等待数据库连接 SqlConnection con = new SqlConnection("server= (local);uid=sa;pwd=密码;database=数据库"); con.Open(); SqlCommand cmd = con.CreateCommand(); cmd.CommandText = "select * from teacher "; SqlDataReader rs = cmd.ExecuteReader(); while(rs.Read()){ String x = String.Format("{0}", rs[0]); // 取出数据库中的第几个下标的信息 String y = String.Format("{0}",rs[2]); } con.Close(); rs.Close(); cmd.ExecuteNonQuery(); // 插入,更新,删除操作,返回的是影响的行数
单选框 radioButton.Checked表示是否被选中
复选框 checkbox1.Checked 表示是否选中
下拉框:
comboBox1.Items.Clear(); comboBox1.Items.Add("生活杂记"); comboBox1.Items.Add("心情随笔"); comboBox1.Items.Add("工作笔记");
comboBox1.SelectedIndex = 0; // 选择第几个
DropDownStyle 属性设置为 DropDownList.
Simple 简单的下拉列表框(始终显示列表)、
DropDown 可以编辑,与有下拉列表。默认.
DropDownList 只有下拉列表,不能编辑。
把textBox之类的空间设置为只读,不可以修改删除的操作:把readonly属性设为true,并且把BackColor这是为White
文件浏览对话框 if (this.openFileDialog2.ShowDialog() == DialogResult.OK) { string FileName = this.openFileDialog2.FileName; // 你的 处理文件路径代码 } 文件夹浏览对话框 FolderBrowserDialog FolderBrowserDialog dilog = new FolderBrowserDialog(); dilog.Description = "请选择文件夹"; if(dilog.ShowDialog() == DialogResult.OK || dilog.ShowDialog() == DialogResult.Yes){ path=dilog.SelectedPath; }
c# webBrowser
window.external 不支持该对象:
查看C# form函数是否为public
axWindowsMediaPlayer控件: axWindowsMediaPlayer1.close(); // 启动时不直接运行该控件 axWindowsMediaPlayer2.Ctlcontrols.play(); // 开始播放 取消上一首歌,播放下一首歌 axWindowsMediaPlayer1.close(); axWindowsMediaPlayer1.currentPlaylist.clear(); axWindowsMediaPlayer1.currentPlaylist.appendItem(axWindowsMediaPlayer1.newMedia(FileName));
将背景设置为透明: this.BackgroundImage = null; this.BackColor = System.Drawing.Color.Red;//将窗体背景设置成红色 this.TransparencyKey = System.Drawing.Color.Red; //将红色设置成透明色 换背景图: this.BackgroundImage = Image.FromFile(System.IO.Path.GetFullPath("bg1.jpg"));
进度条:
你在窗体上拉个进度条进来,然后在窗体上放个按钮,在按钮点击事件里写如下 :
progressBar1.Maximum = 100;//设置最大长度值 progressBar1.Value = 0;//设置当前值 progressBar1.Step = 5;//设置没次增长多少 for (int i = 0; i < 10; i++){//循环 System.Threading.Thread.Sleep(1000);//暂停1秒 progressBar1.Value += progressBar1.Step;让进度条增加一次 }
如何固定的设置窗体大小
有一个关于窗体边界的属性(FromBorderStyle)。这个属性的默认值是Sizable。还有另外六个值,分别为None、FixedSingle、Fixed3D、FixedDialog、FixedToolWindow、SizableToolWindow。None就是无边界,然后窗体右上角也没有最小化、最大化、关闭的按键,一般用于显示ICON或者一般的联系方式。Fixed的意识差不多就是固定的意思。然后Single就是窗体框架只是一条线
C# KeyValuePair<TKey,TValue>的用法。结构体,定义可设置或检索的键/值对。也就是说我们可以通过 它记录一个键/值对这样的值。比如我们想定义一个ID(int类型)和Name(string类型)这样的键/值对,那么可以这 样使用。
/// <summary> /// 设置键/值对 /// </summary> /// <returns></returns> private KeyValuePair<int, string> SetKeyValuePair() { int intKey = 1; string strValue = "My value"; KeyValuePair<int, string> kvp = new KeyValuePair<int, string>(intKey, strValue); return kvp; } /// <summary> /// 获得键/值对 /// </summary> private void GetKeyValuePairDemo() { KeyValuePair<int, string> kvp = SetKeyValuePair(); int intKey = kvp.Key; string strValue = kvp.Value; }
KeyValuePair<int, int> now = new KeyValuePair<int, int>(a,b);
类似于C++ STL
操作 C++(STL) C#(.net) 说明 包含 #include <vector> using System.Collections.Generic; C++中也可以using namespace std; 声明 std::vector<int> array; List<int> array = new List<int>(); 迭代器声明 std::vector<int>::iterator iter=array.begin(); List<int>.Enumerator iter = array.GetEnumerator(); C++ array.push_back(4); array.insert(iter,51); C# array.Add(4); array.Insert(2, 51); C++ int val=array[0]; val=array.at(1); //进行下标检测 C# int val = array[0]; array.Contains(5); //是否包含5 array.IndexOf(1); //元素1的下标 C++ array.pop_back(); //删除最后的元素 array.erase(iter); //删除iter位置的元素 array.clear(); C# array.Remove(1); //删除"1”这个元素 array.RemoveAt(0); //删除0号元素 array.Clear(); C++ array.empty(); array.capacity(); //容量(根据当前非配的内存) array.size(); //元素数 C# array.Count; //元素数 array.Capacity; //容量 遍历 C++ for (std::vector<int>::size_type i=0;i<array.size();++i){} for (iter=array.begin();iter!=array.end();iter++){} for_each(array.begin(),array.end(),func); //func()是函数 C# for (int i = 0; i < array.Count; i++){} while (iter.MoveNext()){} foreach (int d in array){} 排序 std::sort(array.begin(),array.end()); array.Sort(); C++中要#include <algorithm>,上面的for_each也是 如果是自定义的Key类型,C++中需要重载比较运算符;C#中可自定义相等比较器 C++: map #include <map> map<string,int> map; // 当然不能够用map,这里只是说明方便而用的 map_type::iterator iter = ma.begin(); map[_T("first")]=5; map.insert(map_type::value_type(_T("second"),2)); map.insert(map_type::value_type(_T("second"),3)); //不覆盖,不异常 map.erase(iter); //iter有效且不等于map.end() map.erase(_T("first")); map.clear(); int val=map[_T("second")]; //没有则构造新的 iter=map.find(_T("first")); if (iter!=map.end()) val=iter->second; for (iter=map.begin();iter!=map.end();++iter) //遍历时删除 map.erase(iter++); map.size(); map.empty(); //是否为空 C#: Dictionary 命名空间:using System.Collections.Generic; 定义:Dictionary<string, int> map = new Dictionary<string, int>(); 插入:map.Add("first", 5); map["second"] = 2; //这种操作已经进行了插入 //map.Add("second", 3); //重复异常 删除:map.Remove("first"); 清空:map.Clear(); 调用:int data = map["second"]; //不存在则异常 map.ContainsKey("third"); map.ContainsValue(5); map.TryGetValue("hello", out data); 注意C++中下标检索时如果不存在这个元素也不产生错误 foreach (KeyValuePair<string, int> pair in map) //不能进行删除操作 C#: Hashtable 命名空间:using System.Collections; 定义:Hashtable ma = new Hashtable(); 插入:ma["dsa"] = 12; // 可以覆盖之前的 ma.Add("dsadsa",123); 删除:ma["dsa"] = null; 清空:ma.Clear(); 遍历:foreach (DictionaryEntry i in ma) 大小:ma.count 不存在则为null
转自:c# 读写文件时文件正由另一进程使用,因此该进程无法访问该文件
c# 读写文件时文件正由另一进程使用,因此该进程无法访问该文件,在IO处理上遇到了无法操作的问题。
文件“D:\log.txt”正由另一进程使用,因此该进程无法访问该文件。
log.txt是一个日志文件,不定时都可能由另外的程序对它进行日志记录写入操作。
今需要对日志文件读取出来,显示在日志查询里,需要用到了IO流。
1、 FileStream fs = File.OpenRead(url);
StreamReader sr = new StreamReader((System.IO.Stream)fs, System.Text.Encoding.Default);
错误提示:文件“D:\Log\Cargoabc\logfilecargoabc.txt”正由另一进程使用,因此该进程无法访问该文件。
2、StreamReader sr = File.OpenText(url);
错误提示:错误提示:文件“D:\Log\Cargoabc\logfilecargoabc.txt”正由另一进程使用,因此该进程无法访问该文件。
3、 FileStream fs = new FileStream(url, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
StreamReader sr = new StreamReader(fs, System.Text.Encoding.Default);
正确读取。
总结:
这样的情况,不单要与只读方式打开txt文件,而且,需要共享锁。还必须要选择flieShare方式为ReadWrite。因为随时有其他程序对其进行写操作。
1 遍历文件夹folderName 2 DirectoryInfo dir = new DirectoryInfo(folderName); 3 FileInfo[] files = dir.GetFiles("*.txt"); 4 foreach (FileInfo f in files){ 5 string fileName = f.Name.ToString(); 6 } 7 8 文件读取 9 FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); 10 StreamReader fin = new StreamReader(fs); 11 string re = fin.ReadToEnd(); 12 fin.Close(); 13 14 文件写入 15 StreamWriter fout = new StreamWriter(fileName); 16 fout.Write(data); 17 fout.Close();