上面所说道的类库,其实就是引入别人写的代码!
窗体中的控件其实就相当于我们自己所写的类,类有属性,方法。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 no
DialogResult 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();
}
///
/// 数字的点击事件
///
///
///
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;//保存结果的
///
/// 运算符的点击事件
///
///
///
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中的数据
首先为导出按钮添加一个点击事件
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);
}
复制张贴上去会报错:
这时就需要去添加一个引用,我提前将dll文件放在了桌面
需要那个引入的文件可扫描以下二维码:
上面表格,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(json);
if (arrayList.Count > 0)
{
foreach (object item in arrayList)
{
Dictionary dictionary = JsonConvert.DeserializeObject>(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);