字符串截取后4位
#region 获取后几位数 public string GetLastStr(string str,int num)
/// <summary>
/// 获取后几位数
/// </summary>
/// <param name="str">要截取的字符串</param>
/// <param name="num">返回的具体位数</param>
/// <returns>返回结果的字符串</returns>
public string GetLastStr(string str, int num)
{
int count = 0;
if (str.Length > num)
{
count = str.Length - num;
str = str.Substring(count, num);
}
return str;
}
#endregion
C# 代码 换行
1.Windows 中的换行符"\r\n"
2.Unix/Linux 平台换行符是 "\n"。
3.MessageBox.Show() 的换行符为 "\n"
4.Console 的换行符为 "\n"
换行符还因平台差异而不同。
为保持平台的通用性,可以用系统默认换行符 System.Environment.NewLine。
快捷键:
,ctrl+R,ctrl+E这两个组合键,可以自动生成属性中的get和set方法。
和java语法不同的是,除了get/set方法的写法上,还有.net中既有field又properity.
field 是私有字段,内部使用,变量名前要有下画线。
properity是公开的属性,外部可见,变量名前没有下画线。
当然,不用快捷键也可以鼠标选中field变量,然后右键refactor(重构),再encapuslate Field(封装字段)。效果如下:
#region field
private int _LevelId;
private string _LevelName;
#endregion
#region properity
public int LevelId
{
get { return _LevelId; }
set { _LevelId = value; }
}
public string LevelName
{
get { return _LevelName; }
set { _LevelName = value; }
}
#endregion
再有更好的就是,直接输入prop,然后连按两下tab.会自动生成get/set.只需要修改下属性名即可。
字符串换行:
System.Environment.NewLine;
TextBox:
//拉动条
///s设置下拉条
txtSend.Multiline = true;
txtSend.ScrollBars = ScrollBars.Both;
ComboBox:
// 插入值 设置默认值
cmbBaudRate.Items.Add("110");
cmbBaudRate.Items.Add("300");
cmbBaudRate.Items.Add("1200");
cmbBaudRate.Items.Add("2400");
cmbBaudRate.Items.Add("4800");
cmbBaudRate.Items.Add("9600");
cmbBaudRate.Items.Add("19200");
cmbBaudRate.Items.Add("38400");
cmbBaudRate.Items.Add("57600");
cmbBaudRate.Items.Add("115200");
cmbBaudRate.Items.Add("230400");
cmbBaudRate.Items.Add("460800");
cmbBaudRate.Items.Add("921600");
cmbBaudRate.SelectedIndex = 5;
Button:
//点击确定 比如确定配置
DialogResult = DialogResult.OK;
DialogResult = DialogResult.Cancel;
//调用窗体 会获取到是点击的OK还是Cancel
ComSet dlg = new ComSet();
if (dlg.ShowDialog() == DialogResult.OK)
{
// ok
}
else
{
//Cancel
}
//按钮打开文件
OpenFileDialog open = new OpenFileDialog();
open.InitialDirectory = "c\\";
open.RestoreDirectory = true;
open.FilterIndex = 1;
open.Filter = "txt文件(*.txt)|*.txt";
if (open.ShowDialog() == DialogResult.OK)
{
try
{
if (open.OpenFile() != null)
{
txtFileName.Text = open.FileName;
}
}
catch (Exception err1)
{
MessageBox.Show("文件打开错误! " + err1.Message, "提示信息",
MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
}
string 转换
(1)转换为大写:string UpTestStr=testStr.ToUpper();
转换后UpTestStr结果为:ABCDEFG
(2)转换为小写:string LowTestStr=testStr.ToLower();
转换后LowTestStr结果为:abcdefg
取字符串 字段
string str="123456789";
str.Substring(0, 1)
string 位数不够补0
C#位数不足补零
C#位数不足补零:
int i=10;
方法1:Console.WriteLine(i.ToString("D5"));
方法2:Console.WriteLine(i.ToString().PadLeft(5,'0'));//推荐
方法3:Console.WriteLine(i.ToString("00000"));
在 C# 中可以对字符串使用 PadLeft 和 PadRight 进行轻松地补位。
PadLeft(int totalWidth, char paddingChar) //在字符串左边用 paddingChar 补足 totalWidth 长度
PadLeft(int totalWidth, char paddingChar) //在字符串右边用 paddingChar 补足 totalWidth 长度
示例:
h = h.PadLeft(2, '0');
注意第二个参数为 char 类型,所以用单引号,也可以用 Convert.ToChar(string value) 把字符串转换成 char 类型。如果字符串长度大于 1,则使用 str.ToCharArray()[index]。
string 反转
string str1 = "abcdefg";
char[] cs = str1.ToCharArray();
Array.Reverse(cs);
string res = new string(cs);
Console.WriteLine(res);
MessageBox.Show(res);
app.config 配置修改
<appSettings>
<!--开机自启动-->
<add key="SelfStarting" value="0"/>
</appSettings>
//读取
string str = ConfigurationManager.AppSettings["SelfStarting"];
//修改
ConfigText.UpdateAppConfig("SelfStarting", "0");
多线程
在多线程程序中,新创建的线程不能访问UI线程创建的窗口控件,
这个时候如果你想要访问窗口的控件,那么你可以将窗口构造函数
中的CheckForIllegalCrossThreadCalls设置为false.这是线程就
能安全的访问窗体控件了.
如果捕获了对错误线程的调用,则为 true;否则为 false
public Frm_Main()
{
InitializeComponent();
CheckForIllegalCrossThreadCalls = false;
}
/// <summary>
/// 启动线程
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_StartupThread_Click(object sender, EventArgs e)
{
// 线程方法1发卡记录上传接口(vn_base_card)
thread1 = new Thread(new ThreadStart(doSomethingBase_Card));
//启动线程
thread1.Start();
this.BeginInvoke((ThreadStart)delegate ()
{
s9 = db.Insertable(bc.ToArray()).ExecuteCommand();
});
}
DataTable 读写
写入:
DataTable table = new DataTable(); table.Rows.Count; 行数
table.Columns.Add("Name", Type.GetType("System.String"));//添加Name列,存储数据类型为string
table.Columns.Add("Id", Type.GetType("System.Int32"));//添加Id列,存储数据类型为Int
DataRow newRow = table.NewRow();
newRow["Name"] = "张三";
newRow["Id"] = 11;
table.Rows.Add(newRow);
读取:
方法一:
DataTable dt = dataSet.Tables[0];
for(int i = 0 ; i < dt.Rows.Count ; i++)
{
string strName = dt.Rows[i]["字段名"].ToString();
}
方法二:
foreach(DataRow myRow in myDataSet.Tables["temp"].Rows)
{
var str = myRow[0].ToString();
}
方法三:
foeach(DataRow dr in dt.Rows)
{
object value = dr["ColumnsName"];
}
方法四:
DataTable dt=new DataTable();
foreach(DataRow dr in dt.Rows)
{
for(int i=0;i<dt.Columns.Count;i++)
{
dr[i];
}
}
有时候我们需要对数据表进行筛选,微软为我们封装了一个公共方法, DataTable.Select(),其用法如下:
Select()
Select(string filterExpression)
Select(string filterExpression, string sort)
Select(string filterExpression,string sort, DataViewRowState record States)
1) Select()——获取所有 System.Data.DataRow 对象的数组;
2) Select(string filterExpression)——按照主键顺序(如果没有主键,则按照添加顺序)获取与筛选条件相匹配的所有 System.Data.DataRow 对象的数组;
3) Select(string filterExpression, string sort)——获取按照指定的排序顺序且与筛选条件相匹配的所有System.Data.DataRow 对象的数组;
4) Select(string filterExpression, string sort, DataViewRowState recordStates)——获取与排序顺序中的筛选器以及指定的状态相匹配的所有。
举例说明:
有一个用户表,名称为 dtUsers,有id、姓名name、性别sex、年龄age
1.筛选所有的用户
DataRow[] drs1 =dtUsers.Select();
2.筛选所有性别为男的用户
DataRow[] drs2 =dtUsers.Select("sex = '男' ");
3.筛选所有性别为男且年龄在18岁以上的用户
DataRow[] drs3 =dtUsers.Select("sex = '男' and age >= 18");
4.筛选所有性别为男或者年龄在18岁以上的用户
DataRow[] drs4 =dtUsers.Select("sex = '男' or age >= 18");
5.筛选所有姓“夏”的用户
DataRow[] drs5 =dtUsers.Select("name like '夏%'");
6.筛选所有18岁以上的用户且按从大到小的顺序排序
DataRow[] drs5 =dtUsers.Select("age >=18","age desc");
7.上面最后一种用法没试过,有机会再列举出来。
c# DataRow[]转Datatable
方法一:
Datatable dt=new Datatable();
//添加列和数据(代码省略)
DataRow[] drs = dt.Select("DeviceID='123'");
_dt = drs.CopyToDataTable();
dgvList.DataSource = _dt;
方法二:
DataRow[] dr = dt.Select("DeviceID='"+DeviceID+"'");
DataTable d = dt.Clone();
for (int i=0;i<dr.Length;i++)
{
d.ImportRow(dr[i]);
}
注意事项
1.上面的Select操作是不区分大小写的(表字段不敏感,如pl-sql语法),如果需要区分大小写,需要将DataTable的caseSensitive属性设为true,例如上表的
dtUsers.CaseSensitive = true;//区分大小写
dataGridView 样式
解决数据库datatime数据在DataGridView里不显示秒的解决
在数据库中正确显示有分有秒,到dataset里的时候也有,但绑定到DataGridView里的时候就没有秒,解决办法:
dataGridView1.Columns["record_time"].DefaultCellStyle.Format = "yyyy-MM-dd HH:mm:ss";
DataGridView 单元格内容格式内柔发生变化
private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
if (e.ColumnIndex == 3)
{
switch (Convert.ToInt32(e.Value))
{
case 0: e.Value = "现金支付";
e.CellStyle.ForeColor = Color.White;//更改颜色
e.CellStyle.BackColor= Color.Red;
break;
case 1: e.Value = "加油卡支付";
break;
case 2: e.Value = "微信支付";
break;
case 3: e.Value = "POS机支付";
break;
case 4: e.Value = "现金账户支付";
break;
default:
break;
}
}
DataGridView
可以设置DataGridView的SelectionMode属性为FullRowSelect 实现左键点击选取整行,右击的话就需要在鼠标点击事件里面实现了
设置DataGridView的属性MultiSelect为false 这样就使DataGridView不能够选择多行,只能选择一行了
private void dataGridView1_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
//判断索引位置
if (e.ColumnIndex < 0 || e.RowIndex < 0) return;
//判断鼠标左右键
if (e.Button == System.Windows.Forms.MouseButtons.Left)
{
if (dataGridView1.SelectedCells.Count != 0)
{
//得到选中行的索引
int intRow = dataGridView1.SelectedCells[0].RowIndex;
//得到列的索引
int intColumn = dataGridView1.SelectedCells[0].ColumnIndex;
//得到选中行某列的值
string str = dataGridView1.CurrentRow.Cells[2].Value.ToString();
MessageBox.Show(str);
}
}
}
private void dgvCamera_CellClick(object sender, DataGridViewCellEventArgs e)
{
if (e.RowIndex < 0)
{
return;
}
nudCameraId.Value = Convert.ToInt32(dgvCamera.Rows[e.RowIndex].Cells["编号"].Value);
txtCameraIp.Text = Convert.ToString(dgvCamera.Rows[e.RowIndex].Cells["IP"].Value);
}
删除数据:
private void 删除数据_Click(object sender, EventArgs e)
{
try
{
List<int> _lstID = new List<int>();
int _deleNum = -1;
if (dataGridView1.CurrentRow.Index >= 0)
{
StringBuilder _sbMsg = new StringBuilder("确定删除吗?\r\n");
DialogResult result = MessageBox.Show(_sbMsg.ToString(), "操作提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Question);
if (result == DialogResult.OK)
{
for (int i = this.dataGridView1.SelectedRows.Count; i > 0; i--)
{
int _iTagID = Convert.ToInt32(dataGridView1.SelectedRows[i - 1].Cells["Id"].Value);
_lstID.Add(_iTagID);
}
if (_lstID.Count > 0)
{
_deleNum = _db.Deleteable<User>().In(_lstID).ExecuteCommand();
}
查询数据_Click(null, null);
textBox1.Text += "删除成功!" + _deleNum + System.Environment.NewLine;
}
else
{
textBox1.Text += "选择放弃删除!" + System.Environment.NewLine;
}
}
}
catch (Exception ex)
{
textBox1.Text += "删除失败!" + ex.Message + System.Environment.NewLine;
}
}
treeView1
public void date()
{
//公司表
DataTable company = db.Queryable<Base_Company>().ToDataTable();
//部门表
DataTable client = db.Queryable<Base_Client>().ToDataTable();
foreach (DataRow dr in company.Rows)
{
//部门表绑定,作为一级层次
TreeNode tn_origine = new TreeNode();
tn_origine.Text = dr["ClientName"].ToString();
this.treeView1.Nodes.Add(tn_origine);
//用户表绑定
DataRow[] dr_arr = client.Select();
if (dr_arr.Length > 0)
{
foreach (DataRow dr_sub in dr_arr)
{
TreeNode tn_sub = new TreeNode();
tn_sub.Text = dr_sub["ClientName"].ToString();
tn_origine.Nodes.Add(tn_sub);
}
}
}
}
//点击事件
private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
if (Convert.ToInt32(e.Node.Level) > 0)
{
textEdit7.Text = e.Node.Text.ToString();
// MessageBox.Show("您选择的部门是:" + e.Node.Text.ToString(), "信息提示!");
//if (e.Node.Text.Trim() == "销售部门") //如果当前节点的文本为“系统退出”
//{
// MessageBox.Show("部门分类展开所有节点1!", "软件提示");
//}
}
}
toolStrip1控件样式
toolStrip 按钮图片大小的修改
toolStrip 按钮图片大小的修改
1.按钮大小不能修改 //这个问题比较困扰我们,为什么不能修改呢,可能到时没考虑到我们要修改按钮大小
只需改变toolStrip 的一个属性autosize为false即可修改按钮的高度
2.按钮的图片不能修改//这也是很大的一个问题
imagescaling设置为none即可修改图片大小了
3.toolStripDropDownButton1.TextAligon=BottomCenter
4.toolStripDropDownButton1.TextlmageRelation=Overlay
5.displaystyle可以控制显示文本还是图片还是兼得
6.实现鼠标悬停时图标变大吧。
这样写:
toolStripButton1.ImageScaling = ToolStripItemImageScaling.None;
此属性默认是SizeToFit,也就是自动将图标图像缩放到toolStrip合适的大小,
这个数值在toolStrip的AutoSize为false且自己指定了toolStrip的长宽时用比较合适。而None则是指示图标使用原始大小的Image,如果Image高过/宽过toolStrip,超出部分不可见。
所以在运行时想放大图标图像的话,你还需要准备一个大小比较合适的Image。
举例,系统默认添加toolStrip高度是25,你可以关闭toolStrip的AutoSize然后调整高度到31,图标都使用24x24的,当SizeToFit时它会变成16x16的,当需要放大时,改这个项的ImageScaling到None就会还原回24x24。
最后,布局最好配合toolStrip的Padding和LayoutStyle属性来做。
最后的最后,如果想要任意换图标……还是改了ImageScaling后自己找几组大小不同的图标,需要的时候写给子项的Image属性好了。
pictureBox1控件属性设置
/// <summary>
/// 选择文件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2_Click(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();//新建打开文件对话框
ofd.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Personal);//设置初始文件目录
ofd.Filter = "文本文件(*.txt)|*.txt|所有文件(*.*)|*.*";//设置打开文件类型
if (ofd.ShowDialog(this) == DialogResult.OK)
{
//File.Delete(Application.StartupPath + "\\image\\123.jpg");
//zoomauto(ofd.FileName, Application.StartupPath + "\\image\\", 156, 148);
string FileName = ofd.FileName;//FileName就是要打开的文件路径
textBox2.Text = FileName;
label3.Text= Path.GetFileName(ofd.FileName);//得到返回的文件名//下边可以添加用户代码
}
pictureBox1.ImageLocation = textBox2.Text;
}
DateTimePicker
DateTimePicker
//默认状态下,DateTimePicker控件只显示日期,如果想更改为显示时间,或日期+时间,需要做以下设置:
//控制日期或时间的显示格式
this.DateTimePicker1.CustomFormat = "yyyy-MM-dd HH:mm:ss"
//使用自定义格式
this.DateTimePicker1.Format = DateTimePickerFormat.Custom
//时间控件的启用
this.DateTimePicker1.ShowUpDown = True
MessageBox.Show
MessageBox.Show
if (MessageBox.Show("是否删除油罐信息", "注意", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
{
//new 出你要问打开的新答窗体专
}else{
this.close();//或者
application.exit()属;
}
自定义控件 代码调用多个排序
/// <summary>
/// 加油机控件
///
/// </summary>
public void Control()
{
try
{
int nber = Convert.ToInt32(Config.OilNumber);
if (nber > 9)
{
for (int i = 0; i < 9; i++)
{
Control.Refueller r1 = new Control.Refueller();
r1.Name = "jy" + i;
r1.Size = new Size(220, 281);
//r1.ResetText = "123123123123";
r1.Location = new Point(220 * i, 0);
r1.Show();
splitContainer1.Panel1.Controls.Add(r1);
}
nber = nber - 9;
if (nber > 0)
{
for (int i = 0; i < nber; i++)
{
Control.Refueller r1 = new Control.Refueller();
r1.Name = "jy" + i;
r1.Size = new Size(220, 281);
//r1.ResetText = "123123123123";
r1.Location = new Point(220 * i, 281);
r1.Show();
splitContainer1.Panel1.Controls.Add(r1);
}
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}