Winform的内容
一、理解.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的内容相关推荐
- WinForm邮件内容编辑器的简单实现
1.概述 在WinForm开发中,您可能会碰到发送邮件时内容编辑的问题,大部分开发人员第一个想法是希望将 WinForm中的内容编辑器做到和.NET 中类似FCK一样.今天我们就来介绍下如 ...
- “小朋友”们节日快乐呀~
大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂. 今天是六月一日--儿童节,看了看朋友圈,不管是大孩子还是小孩子,都在过节,哈哈哈. 最近四班一直在做项目,一共6个小组,大致的看了看,已经有两个小 ...
- WinForm界面开发之“HTML内容编辑控件”
做过了很多Winform的共享软件,对界面的设计有了一定的经验和积累,准备开一个"WinForm界面开发"系列文章,介绍下相关的Winform界面设计和相关控件的使用,促进相互交流 ...
- C#在WinForm中实现清空指定类型控件的内容
实现在Winform中递归控件来清空指定类型控件的内容(因为在Winform中,各个控件是有层次关系的,不能简单地依靠遍历this.controls) private void ClearConten ...
- Winform中实现List<string>赋值给dataGridView与实现多选、全选和获取选择的内容
场景 Winform中给DataGridView添加多选框列并获取选中行的内容: Winform中给DataGridView添加多选框列并获取选中行的内容_BADAO_LIUMANG_QIZHI的博客 ...
- Winform中设置ZedGraph鼠标悬浮显示线上的点的坐标并自定义显示的内容
场景 Winform中设置ZedGraph鼠标悬浮显示距离最近曲线上的点的坐标值和X轴与Y轴的标题: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article ...
- Winform中给DataGridView添加多选框列并获取选中行的内容
场景 使用NPOI导入Excel并赋值给DataTable,然后显示在DataGrdView上,并且添加多选框,然后获取选中行的内容. Winform中使用NPOI实现Excel导入并赋值给DataT ...
- c# winform 打印 窗体 及 窗体控件内容 的 初级尝试
学习c# winform 打印 参照了网络上诸多资源 效果示意: 操作步骤: 1.新建winform项目及创建窗体 2.拖取 打印 相关控件 PageSetupDialog . PrintDia ...
- 【WinForm】打印机编辑打印内容并实现双排打印
本次使用的打印机是Gprinter GP-9134T 实现打印的主要代码就是 PrintDocument printDocument = new PrintDocument(); //设置边距 pri ...
最新文章
- 读写分离很难吗?SpringBoot结合aop简单就实现了
- 浮点运算为什么不准?有人为0.30000000000000004建了个网站
- 一篇文章让你彻底了解什么叫Netty!大牛看了直呼内行!
- 结构体struct timeval 和 struct timespec的定义
- Sql Server日期格式的转换收集
- android 4个布局,Android - 4种基本布局
- linux 提示符 异常,linux终端提示符异常 bash-4.1$
- Java环境变量的设置
- STL源码剖析 lower_bound | upper_bound | binary_search
- 与gps优缺点_浅谈用于洒水车上的液位传感器和GPS模块
- cron java_cron表达式
- store.js - 轻松实现本地存储(LocalStorage)
- 巨蟒django之CRM2 展示客户列表分页
- (转)让页面自动滚动到刷新页面之前的控件处,减少页面刷新带来的不便。
- Python数据挖掘进阶--泰坦尼克号案例分析
- Python Turtle画奥运标志
- 工厂模式,从第三方登录说起
- 2019/04/05 腾讯笔试 后台及综合卷(java)
- 解决Extraneous non-props attributes (border, class) were passed to component but could not be
- 服务器ping不通网址!