Winform的内容

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

Winform的内容_第1张图片

Winform的内容_第2张图片 Winform的内容_第3张图片

Winform的内容_第4张图片 Winform的内容_第5张图片

Winform的内容_第6张图片

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

 Winform的内容_第7张图片

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

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

Winform的内容_第9张图片

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

Winform的内容_第10张图片

Winform的内容_第11张图片

Winform的内容_第12张图片

 这有啥用呢?

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

 Winform的内容_第13张图片

 按下Tab键之后:

Winform的内容_第14张图片

再按一次Tab键:

 Winform的内容_第15张图片

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

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

Winform的内容_第16张图片

 

如果需要关闭窗体呢? 

Winform的内容_第17张图片如果用的是this.close()的话其实并没有完全关闭,只是关闭了当前窗体

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

 

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

Winform的内容_第18张图片

 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事件

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

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

以上为第一部分内容

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

Winform的内容_第19张图片

Winform的内容_第20张图片 Winform的内容_第21张图片

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

Winform的内容_第22张图片

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

Winform的内容_第23张图片

Winform的内容_第24张图片

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

效果图:

Winform的内容_第25张图片

 Winform的内容_第26张图片

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

Winform的内容_第27张图片

 

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

Winform的内容_第28张图片

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

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

Winform的内容_第29张图片

 我们可以双击这个按钮7

Winform的内容_第30张图片

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

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

Winform的内容_第31张图片

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

Winform的内容_第32张图片

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

Winform的内容_第33张图片 Winform的内容_第34张图片

 Winform的内容_第35张图片

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

最终的代码:

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:

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

Winform的内容_第36张图片

现在我在最下面添加一个按钮,用于导出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);
        }

 复制张贴上去会报错:

Winform的内容_第37张图片

 这时就需要去添加一个引用,我提前将dll文件放在了桌面

Winform的内容_第38张图片

Winform的内容_第39张图片点击确定之后项目就不会报错了!

Winform的内容_第40张图片 运行看效果

Winform的内容_第41张图片

Winform的内容_第42张图片

Winform的内容_第43张图片 是不是非常简单,调用一个方法和添加一个引用即可?

需要那个引入的文件可扫描以下二维码:

Winform的内容_第44张图片

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

Winform的内容_第45张图片

代码:

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);
        }
    }
}

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

Winform的内容_第46张图片

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

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

Winform的内容_第47张图片

我们试着往上面拖控件

Winform的内容_第48张图片

Winform的内容_第49张图片 我们可以将这个窗体上的控件都循环出来

 Winform的内容_第50张图片

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

Winform的内容_第51张图片

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

Winform的内容_第52张图片

实现:

Winform的内容_第53张图片

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

Winform的内容_第54张图片

 Winform的内容_第55张图片

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

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

Winform的内容_第56张图片 Winform的内容_第57张图片

如何绑定下拉框呢?

Winform的内容_第58张图片 ​​​​​Winform的内容_第59张图片

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

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

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

 Winform的内容_第60张图片

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

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

Winform的内容_第61张图片 如果使用的是this.cboClassInfos.Items.Add("----请选择---"),就不能用数据源绑定!

Winform的内容_第62张图片

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

如何把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类型的变量进行接收:

根据调试:

Winform的内容_第63张图片

那么如果是想要将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);

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

Winform的内容_第64张图片

你可能感兴趣的:(Winform系列,c#,开发语言,后端)