一、理解.Net框架/窗体的设计原理/常用基础控件

 

 

上面所说道的类库,其实就是引入别人写的代码!

窗体中的控件其实就相当于我们自己所写的类,类有属性,方法。Winform窗体中的控件其实就已经是别人写好的,我们只需要用就可以!

 以下是我建的一个用户登录的窗体:除了两个label标签,我先拖入的是button按钮,然后是用户密码框,最后是用户账号文本框。(下图中的数字代表我将控件拖入窗体的顺序)

这时我们去关注这三个控件的TabIndex属性。哪个控件最先拖入到窗体,哪个控件的TabIndex属性的值越小(越排前);

这有啥用呢?

就相当于界面一运行,就默认聚焦到button按钮上,按下Tab键,然后就会密码框,最后到文本框。

按下Tab键之后:

再按一次Tab键:

默认情况下,是输入完账号和密码,然后按Tab键聚焦到登录按钮上,然后再按回车就可以登录了。

但是如果我们想输入完账号密码后直接按回车登录的话,需要设置窗体的AcceptButton属性为你对应的事件即可!

如果需要关闭窗体呢?

如果用的是this.close()的话其实并没有完全关闭,只是关闭了当前窗体

如果开了10个窗体,但是主进程没有关掉,那这个应用程序就不会关掉!所以关闭整个应用程序应该用Application.Exit();

关闭的窗体的时候如果想要提示该如何去做呢?不妨先去看看MessageBox.show()方法

 private void btnExit_Click(object sender, EventArgs e){//弹出的框框其实就是模式窗体 结果是yes or noDialogResult result= MessageBox.Show("确认关闭吗?","提示",MessageBoxButtons.OKCancel,MessageBoxIcon.Question);if (result==DialogResult.OK){Application.Exit();}}

除了主进程(项目一开始运行的窗体)的其他窗体,如果想通过其他窗体直接关闭应用程序 ,通过窗体的FormClosed事件

 如果想要文本框获取焦点:

由于主进程窗体只能隐藏,所以:

以上为第一部分内容

二、事件驱动机制、制作计算器(小工具)

 

如果只允许窗体那么大(比如说给窗体添加了背景图片),可以通过MaximumSize属性和MinimumSize属性

如果想要取消最大化和最小化按钮,设置MaximizeBox和MinimizeBox为false即可

双击文本框的时候,会给文本框注册一个TextChanged事件,假设做一个账号输入的验证,账号长度只能在6-12位

效果图:

实现方式很简单,就是文本框的TextChanged事件。

接下来做一个简单的计算器:

as是兼容性的转换,转换如果不成功不会报错

实现计算机的第一步:需要注意的点,这个文本框要设置为只读的,ReadOnly=true。

我们可以双击这个按钮7

我们复制这个事件的名称:btnNumber_Click

接下来同时选中剩下的几个数字

找到click事件,将之前复制的事件名称(btnNumber_Click)复制上去

这样的话,所有的数字按钮触发的都是同一个事件。那现在的问题就在于,如何区分到底点的是哪一个按钮呢?我们可以sender这个参数,来确定我们点击的是哪个按钮

 

同时我们也需要为对应的+、-、*、/运算符添加相同的事件。

最终的代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace WindowsFormsApp1
{public partial class CalForm : Form{public CalForm(){InitializeComponent();}/// <summary>/// 数字的点击事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnNumber_Click(object sender, EventArgs e){if (this.textBox1.Text=="0")//防止出现输入的是001、003等情况{this.textBox1.Text = "";}Button button = sender as Button;this.textBox1.Text += button.Text;//获取点击按钮上的数字}string _opterate;//保存运算符double result;//保存结果的/// <summary>/// 运算符的点击事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnOperate_Click(object sender, EventArgs e){Button button = sender as Button;_opterate = button.Text;//获取运算符result = double.Parse(this.textBox1.Text);//保存第一个输入的数字this.textBox1.Text = "0";}private void btnEquals_Click(object sender, EventArgs e){double number= double.Parse(this.textBox1.Text);//第二次输入的数字switch (_opterate){case "+":result  += number;break;case "-":result  -= number;break;case "*":result  *= number;break;case "/":result /=number;break;default:break;}this.textBox1.Text = result.ToString();}private void btnDot_Click(object sender, EventArgs e){//小数点只能出现一次,并且是需要在第一位的后面,比如说1.2,3.4等等,而不能是.1 .2啥的if (this.textBox1.Text.IndexOf(".")==-1)//-1是表示不存在的意思{this.textBox1.Text += ".";}}private void btnDelete_Click(object sender, EventArgs e){if (this.textBox1.Text == "0") return;this.textBox1.Text=this.textBox1.Text.Substring(0, this.textBox1.Text.Length - 1);if (this.textBox1.Text==""){this.textBox1.Text = "0";}}//归零private void btnClear_Click(object sender, EventArgs e){this.textBox1.Text = "0";result = 0;}}
}

以上的代码只是一个小demo,可以实现最基本的加减乘除,但是不能连续加。

下面写一下导出winform实现导出excel:

首先的就是有一个窗体里面有表格:

现在我在最下面添加一个按钮,用于导出datagridView1中的数据

首先为导出按钮添加一个点击事件

 调用的ExportExcels方法:

 private void ExportExcels(string fileName, DataGridView myDGV){string saveFileName = "";SaveFileDialog saveDialog = new SaveFileDialog();saveDialog.DefaultExt = "xlsx";saveDialog.Filter = "Excel文件|*.xlsx";saveDialog.FileName = fileName;saveDialog.ShowDialog();saveFileName = saveDialog.FileName;if (saveFileName.IndexOf(":") < 0) return; //被点了取消Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();if (xlApp == null){MessageBox.Show("无法创建Excel对象,可能您的机子未安装Excel");return;}Microsoft.Office.Interop.Excel.Workbooks workbooks = xlApp.Workbooks;Microsoft.Office.Interop.Excel.Workbook workbook = workbooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet);Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[1];//取得sheet1//写入标题for (int i = 0; i < myDGV.ColumnCount; i++){worksheet.Cells[1, i + 1] = "'" + myDGV.Columns[i].HeaderText.ToString();}//写入数值for (int r = 0; r < myDGV.Rows.Count; r++){for (int i = 0; i < myDGV.ColumnCount; i++){worksheet.Cells[r + 2, i + 1].NumberFormatLocal = "G/通用格式";worksheet.Cells[r + 2, i + 1] = myDGV.Rows[r].Cells[i].Value;}System.Windows.Forms.Application.DoEvents();}worksheet.Columns.EntireColumn.AutoFit();//列宽自适应if (saveFileName != ""){try{workbook.Saved = true;workbook.SaveCopyAs(saveFileName);}catch (Exception ex){MessageBox.Show("导出文件时出错,文件可能正被打开!\n" + ex.Message);}}xlApp.Quit();GC.Collect();//强行销毁MessageBox.Show("保存成功", "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Information);}

复制张贴上去会报错:

这时就需要去添加一个引用,右键=》添加引用=》管理nuget包,找到下图所示的第一个即可!

点击确定之后项目就不会报错了!

 运行看效果

但是以上导出Excel的方法还存在弊端,因为当数据量多大时导出的速度非常慢!

下面还有导出excel的方法,直接调用就可以使用:

        //// 摘要://     将DataGridView保存为Excel//// 参数://   fileName://     默认文件名////   myDGV://     需要导出为Excel的DataGridViewpublic static void Export(string fileName, DataGridView myDGV){string text = "";SaveFileDialog saveFileDialog = new SaveFileDialog();saveFileDialog.DefaultExt = "xlsx";saveFileDialog.Filter = "Excel文件|*.xlsx";saveFileDialog.FileName = fileName;saveFileDialog.ShowDialog();text = saveFileDialog.FileName;if (text.IndexOf(":") < 0){return;}Microsoft.Office.Interop.Excel.Application application = (Microsoft.Office.Interop.Excel.Application)Activator.CreateInstance(Marshal.GetTypeFromCLSID(new Guid("00024500-0000-0000-C000-000000000046")));if (application == null){MessageBox.Show("无法创建Excel对象,可能您的机子未安装Excel");return;}Workbooks workbooks = application.Workbooks;Workbook workbook = workbooks.Add(XlWBATemplate.xlWBATWorksheet);Worksheet worksheet = (Worksheet)(dynamic)workbook.Worksheets[1];Worksheet worksheet2 = null;worksheet2 = (Worksheet)(dynamic)workbook.ActiveSheet;for (int i = 0; i < myDGV.ColumnCount; i++){worksheet2.Cells[1, i + 1] = "'" + myDGV.Columns[i].HeaderText.ToString();}try{object[,] array = new object[myDGV.Rows.Count, myDGV.Columns.Count];for (int j = 0; j < myDGV.Rows.Count; j++){for (int k = 0; k < myDGV.Columns.Count; k++){array[j, k] = myDGV.Rows[j].Cells[k].FormattedValue.ToString();}}Range range = worksheet2.Range[(dynamic)worksheet.Cells[2, 1], (dynamic)worksheet.Cells[myDGV.Rows.Count + 1, myDGV.Columns.Count]];range.Value2 = array;worksheet2 = range.Worksheet;worksheet2.Columns.EntireColumn.AutoFit();workbook.Saved = true;workbook.SaveCopyAs(text);application.Quit();GC.Collect();MessageBox.Show("保存成功", "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);}catch (Exception ex){MessageBox.Show(ex.Message);}}//// 摘要://     将DataTable保存为Excel//// 参数://   fileName://     默认文件名////   myDt://     需要导出为Excel的DataTablepublic static void Export(string fileName, DataTable myDt){string text = "";SaveFileDialog saveFileDialog = new SaveFileDialog();saveFileDialog.DefaultExt = "xlsx";saveFileDialog.Filter = "Excel文件|*.xlsx";saveFileDialog.FileName = fileName;saveFileDialog.ShowDialog();text = saveFileDialog.FileName;if (text.IndexOf(":") < 0){return;}Microsoft.Office.Interop.Excel.Application application = (Microsoft.Office.Interop.Excel.Application)Activator.CreateInstance(Marshal.GetTypeFromCLSID(new Guid("00024500-0000-0000-C000-000000000046")));if (application == null){MessageBox.Show("无法创建Excel对象,可能您的机子未安装Excel");return;}Workbooks workbooks = application.Workbooks;Workbook workbook = workbooks.Add(XlWBATemplate.xlWBATWorksheet);Worksheet worksheet = (Worksheet)(dynamic)workbook.Worksheets[1];Worksheet worksheet2 = null;worksheet2 = (Worksheet)(dynamic)workbook.ActiveSheet;for (int i = 0; i < myDt.Columns.Count; i++){worksheet2.Cells[1, i + 1] = "'" + ((object)myDt.Columns[i]).ToString();}try{object[,] array = new object[myDt.Rows.Count, myDt.Columns.Count];for (int j = 0; j < myDt.Rows.Count; j++){for (int k = 0; k < myDt.Columns.Count; k++){array[j, k] = myDt.Rows[j][k].ToString();}}Range range = worksheet2.Range[(dynamic)worksheet.Cells[2, 1], (dynamic)worksheet.Cells[myDt.Rows.Count + 1, myDt.Columns.Count]];range.Value2 = array;worksheet2 = range.Worksheet;worksheet2.Columns.EntireColumn.AutoFit();workbook.Saved = true;workbook.SaveCopyAs(text);application.Quit();GC.Collect();MessageBox.Show("保存成功", "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);}catch (Exception ex){MessageBox.Show(ex.Message);}}

上面表格,1、根据条件实现背景颜色切换 2、点击表格1的某一行,这一行的数据传入表格二

代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace WindowsFormsApp1
{public partial class Form1 : Form{public Form1(){InitializeComponent();}private void Form1_Load(object sender, EventArgs e){DataTable dt = new DataTable();string sql = "select * from userInfo";dt = DBHelper.GetDataTable(sql);this.dataGridView1.DataSource = dt;}private void dataGridView1_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e){DataGridViewRow dr = (sender as DataGridView).Rows[e.RowIndex];if (e.RowIndex >= dataGridView1.Rows.Count - 1){return;}if (int.Parse(dr.Cells["userage"].Value.ToString().Trim()) > 16){dr.DefaultCellStyle.BackColor = Color.Yellow;}}private void dataGridView1_SelectionChanged(object sender, EventArgs e){if (dataGridView1.CurrentRow == null)return;int index = dataGridView1.CurrentRow.Index;if (index > -1 && dataGridView1.Rows[index].Cells["userguid"].Value != null){string userguid = dataGridView1.Rows[index].Cells["userguid"].Value == null ? "" : dataGridView1.Rows[index].Cells["userguid"].Value.ToString();string username = dataGridView1.Rows[index].Cells["username"].Value == null ? "" : dataGridView1.Rows[index].Cells["username"].Value.ToString();DataTable dt = new DataTable();string sql = "select userguid,username from userInfo where userguid='" + userguid + "' and username='" + username + "'";dt = DBHelper.GetDataTable(sql);this.dataGridView2.DataSource = dt;}}private void btnExitExcel_Click(object sender, EventArgs e){ExportExcels("用户信息", dataGridView1);}private void ExportExcels(string fileName, DataGridView myDGV){string saveFileName = "";SaveFileDialog saveDialog = new SaveFileDialog();saveDialog.DefaultExt = "xlsx";saveDialog.Filter = "Excel文件|*.xlsx";saveDialog.FileName = fileName;saveDialog.ShowDialog();saveFileName = saveDialog.FileName;if (saveFileName.IndexOf(":") < 0) return; //被点了取消Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();if (xlApp == null){MessageBox.Show("无法创建Excel对象,可能您的机子未安装Excel");return;}Microsoft.Office.Interop.Excel.Workbooks workbooks = xlApp.Workbooks;Microsoft.Office.Interop.Excel.Workbook workbook = workbooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet);Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[1];//取得sheet1//写入标题for (int i = 0; i < myDGV.ColumnCount; i++){worksheet.Cells[1, i + 1] = "'" + myDGV.Columns[i].HeaderText.ToString();}//写入数值for (int r = 0; r < myDGV.Rows.Count; r++){for (int i = 0; i < myDGV.ColumnCount; i++){worksheet.Cells[r + 2, i + 1].NumberFormatLocal = "G/通用格式";worksheet.Cells[r + 2, i + 1] = myDGV.Rows[r].Cells[i].Value;}System.Windows.Forms.Application.DoEvents();}worksheet.Columns.EntireColumn.AutoFit();//列宽自适应if (saveFileName != ""){try{workbook.Saved = true;workbook.SaveCopyAs(saveFileName);}catch (Exception ex){MessageBox.Show("导出文件时出错,文件可能正被打开!\n" + ex.Message);}}xlApp.Quit();GC.Collect();//强行销毁MessageBox.Show("保存成功", "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Information);}}
}

三、常用容器/布局方式/菜单与工具栏

以上两个控件可以自己试着去玩!

接下来的话是groupbox,它其实就是一个集合!

我们试着往上面拖控件

 我们可以将这个窗体上的控件都循环出来

又比如我可以通过以下方式来判断控件是文本框还是label

又比如说我们在groupbox2容器中放了很多的textbox文本框,我们也可以利用循环将内容全部清除,就相当于是重置的功能!

实现:

除了以上方式之外呢?还有一种:

Anchor属性可以实现自适应,也就是窗体放大,控件就会随着变大,反之!

所以布局的话可以使用到两个属性:Dock,Anchor

 

如何绑定下拉框呢?

 ​​​​​

显示的信息和隐藏的信息要放在绑定数据源之前更好!

可以通过以下两种方式获取选中的值:

第一个就是编号(this.cboClassInfos.SelectedValue.ToString()),第二个就是显示的值(this.cboClassInfos.Text)

将下拉框的DropDownStyle属性设置为DropDownList就表示下拉框是不能编辑的

NewRow表示创建一个与表相同的架构

 如果使用的是this.cboClassInfos.Items.Add("----请选择---"),就不能用数据源绑定!

除此之外呢?还有一种方式哦:

如何把DataTable转换成Json格式的数据?

首先可以添加一个JsonHelper类。类中添加一个方法:

  public static string GetJsonByDataTable(DataTable table){StringBuilder stringBuilder = new StringBuilder();try{if (table.Rows.Count > 0){stringBuilder.Append("[");for (int i = 0; i < table.Rows.Count; i++){stringBuilder.Append("{");for (int j = 0; j < table.Columns.Count; j++){if (DateTime.TryParse(table.Rows[i][j].ToString(), out DateTime _)){table.Rows[i][j] = table.Rows[i][j].ToString().Replace("T", " ");}if (j < table.Columns.Count - 1){stringBuilder.Append("\"" + table.Columns[j].ColumnName.ToString() + "\":\"" + table.Rows[i][j].ToString() + "\",");}else if (j == table.Columns.Count - 1){stringBuilder.Append("\"" + table.Columns[j].ColumnName.ToString() + "\":\"" + table.Rows[i][j].ToString() + "\"");}}if (i == table.Rows.Count - 1){stringBuilder.Append("}");}else{stringBuilder.Append("},");}}stringBuilder.Append("]");}}catch (Exception){}return stringBuilder.ToString();}

直接用string类型的变量进行接收:

根据调试:

那么如果是想要将json转换为DataTable呢?

可以使用以下方法:

public static DataTable GetDataTableByJson(string json){DataTable dataTable = new DataTable();try{if (json.Contains("null")){json = json.Replace("null", "");}ArrayList arrayList = Newtonsoft.Json.JsonConvert.DeserializeObject<ArrayList>(json);if (arrayList.Count > 0){foreach (object item in arrayList){Dictionary<string, object> dictionary = JsonConvert.DeserializeObject<Dictionary<string, object>>(item.ToString());if (dictionary.Keys.Count() == 0){return dataTable;}if (dataTable.Columns.Count == 0){foreach (string key in dictionary.Keys){dataTable.Columns.Add(key, dictionary[key].GetType());}}DataRow dataRow = dataTable.NewRow();foreach (string key2 in dictionary.Keys){dataRow[key2] = dictionary[key2];}dataTable.Rows.Add(dataRow);}}}catch (Exception){}return dataTable;}

我们可以准备一个json数据来进行测试:

string aa = "[{\"userguid\":\"09B4B3B5 - 3E4F - 4DA5 - 8044 - B490E76EE5D8\",\"username\":\"李敏\",\"userage\":\"20\",\"usersex\":\"0\",\"usertel\":\"13298765432\"},{\"userguid\":\"0BA8EF8A - 6131 - 42D8 - B9E8 - 9E54DAFA703C\",\"username\":\"小明明\",\"userage\":\"16\",\"usersex\":\"1\",\"usertel\":\"13298765432\"},{\"userguid\":\"3854ED9B - 1759 - 417A - B1C3 - EBCC01855619\",\"username\":\"哈哈哈\",\"userage\":\"23\",\"usersex\":\"0\",\"usertel\":\"13298765432\"},{\"userguid\":\"38A693AD - DAE6 - 462E-88A7 - E4401CCADD20\",\"username\":\"黄龙\",\"userage\":\"11\",\"usersex\":\"1\",\"usertel\":\"13298765432\"},{\"userguid\":\"5D56DC95 - 6D0D - 4A6B - BB1D - 4E66151B9A3A\",\"username\":\"哈哈哈\",\"userage\":\"10\",\"usersex\":\"1\",\"usertel\":\"13298765432\"},{\"userguid\":\"82E6A779 - A7AC - 4194 - 9080 - 8A04C5FE9690\",\"username\":\"石山脚\",\"userage\":\"32\",\"usersex\":\"0\",\"usertel\":\"13298765432\"},{\"userguid\":\"FD5F3C95 - 9BA5 - 4AE7 - 85E0 - 75C47BC48FBD\",\"username\":\"邓家微\",\"userage\":\"46\",\"usersex\":\"1\",\"usertel\":\"13298765432\"}]";DataTable dtJson = JsonHelper.GetDataTableByJson(aa);

四、ListView多视图控件/右键菜单/Timer定时器

第一:ListView的使用

对于固定的数据,可以手动绑定,也可以动态绑定,数据来源于数据库、某个文件

首先拖入ListView控件

选择编辑列:

运行一下:

然而发现并没有任何效果,原因就是:

 然后我们右键选择编辑项

如何添加图片 呢?

首先拖入两个imageList控件到窗体中

然后将imageList1的图像大小设置为(40,40),因为我的图片是40x40像素的。

接着设置imageList2的图像大小为(16,16),然后选择图象

分别为imageList1和imageList2添加图象

然后选中ListView控件,找到

然后选中ListView控件,右键编辑项,然后设置imageIndex属性,选择图片即可!

然后设置View属性的值为LargeIcon

看看效果:

我们还是设置View属性的值为Details:

我们添加几个按钮,点击不同按钮实现不同的效果:

其实就是这一行代码即可:this.listView.View=View.LargeIcon

换一种简单的写法:

每个按钮的name属性是不一样的,但是click事件是同一个事件,并且需要提前设置好每个按钮的Tag属性的值,这样我们就可以获取到这个按钮了,为什么不用btn.text,因为btn.Text获取的是按钮的Text属性,而Text属性有时候如果业务变了可能就需要改,所以就设置Tag属性,通过Tag来获取选中的按钮!

以上就是ListView的内容!

第二:右键菜单的使用

接着上面的例子,拖入contextMenuStrip控件到窗体中,设置右键菜单的内容,也是同时选中所有设置click事件,然后选中ListView,选择contextMenuStrip属性,选择我们拖入的控件即可!

下图中箭头部分代码就是判断右键菜单选中的是哪一个,所以还是需要去设置右键菜单中每一项的Tag属性(自己命名即可)!

Winform的内容相关推荐

  1. WinForm邮件内容编辑器的简单实现

    1.概述       在WinForm开发中,您可能会碰到发送邮件时内容编辑的问题,大部分开发人员第一个想法是希望将 WinForm中的内容编辑器做到和.NET 中类似FCK一样.今天我们就来介绍下如 ...

  2. “小朋友”们节日快乐呀~

    大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂. 今天是六月一日--儿童节,看了看朋友圈,不管是大孩子还是小孩子,都在过节,哈哈哈. 最近四班一直在做项目,一共6个小组,大致的看了看,已经有两个小 ...

  3. WinForm界面开发之“HTML内容编辑控件”

    做过了很多Winform的共享软件,对界面的设计有了一定的经验和积累,准备开一个"WinForm界面开发"系列文章,介绍下相关的Winform界面设计和相关控件的使用,促进相互交流 ...

  4. C#在WinForm中实现清空指定类型控件的内容

    实现在Winform中递归控件来清空指定类型控件的内容(因为在Winform中,各个控件是有层次关系的,不能简单地依靠遍历this.controls) private void ClearConten ...

  5. Winform中实现List<string>赋值给dataGridView与实现多选、全选和获取选择的内容

    场景 Winform中给DataGridView添加多选框列并获取选中行的内容: Winform中给DataGridView添加多选框列并获取选中行的内容_BADAO_LIUMANG_QIZHI的博客 ...

  6. Winform中设置ZedGraph鼠标悬浮显示线上的点的坐标并自定义显示的内容

    场景 Winform中设置ZedGraph鼠标悬浮显示距离最近曲线上的点的坐标值和X轴与Y轴的标题: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article ...

  7. Winform中给DataGridView添加多选框列并获取选中行的内容

    场景 使用NPOI导入Excel并赋值给DataTable,然后显示在DataGrdView上,并且添加多选框,然后获取选中行的内容. Winform中使用NPOI实现Excel导入并赋值给DataT ...

  8. c# winform 打印 窗体 及 窗体控件内容 的 初级尝试

    学习c# winform 打印 参照了网络上诸多资源 效果示意: 操作步骤: 1.新建winform项目及创建窗体 2.拖取 打印 相关控件    PageSetupDialog . PrintDia ...

  9. 【WinForm】打印机编辑打印内容并实现双排打印

    本次使用的打印机是Gprinter GP-9134T 实现打印的主要代码就是 PrintDocument printDocument = new PrintDocument(); //设置边距 pri ...

最新文章

  1. 读写分离很难吗?SpringBoot结合aop简单就实现了
  2. 浮点运算为什么不准?有人为0.30000000000000004建了个网站
  3. 一篇文章让你彻底了解什么叫Netty!大牛看了直呼内行!
  4. 结构体struct timeval 和 struct timespec的定义
  5. Sql Server日期格式的转换收集
  6. android 4个布局,Android - 4种基本布局
  7. linux 提示符 异常,linux终端提示符异常 bash-4.1$
  8. Java环境变量的设置
  9. STL源码剖析 lower_bound | upper_bound | binary_search
  10. 与gps优缺点_浅谈用于洒水车上的液位传感器和GPS模块
  11. cron java_cron表达式
  12. store.js - 轻松实现本地存储(LocalStorage)
  13. 巨蟒django之CRM2 展示客户列表分页
  14. (转)让页面自动滚动到刷新页面之前的控件处,减少页面刷新带来的不便。
  15. Python数据挖掘进阶--泰坦尼克号案例分析
  16. Python Turtle画奥运标志
  17. 工厂模式,从第三方登录说起
  18. 2019/04/05 腾讯笔试 后台及综合卷(java)
  19. 解决Extraneous non-props attributes (border, class) were passed to component but could not be
  20. 服务器ping不通网址!

热门文章

  1. android+平板+输入法,搜狗推首款Android3.0平板电脑输入法
  2. 过会10个月,保荐机构主动要求撤销上市保荐,IPO终止
  3. Oracle项目管理主数据之RBS与ROBS
  4. 在Linux中运行Nancy应用程序
  5. 十三、Jmeter生成html报告
  6. 李敖-学习和看书方法
  7. 艾永亮:服装业的投机主义,满足的到底是谁的需求?
  8. 面向对象(static关键字)
  9. 单片机 李广弟_单片机基础(第3版)
  10. 数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已