非标自动化系统技术总结(一)九龙项目测试工程(wpf mvvm prism)

技术栈

C# WPF MVVM(prism)

页面结构

选择连接参数
原始表格数据
与PLC连接
圆角显示在datagrid中
向PLC写入数据

在这里插入图片描述

技术路线及难点

一、将Excel文件转化为datatable
本项目使用的是xls文件,使用EPPLUS和NPIO转换失败,根据资料显示EPPLUS适合转换xlsx格式,NPIO适合转换xls,本文采用的是内置的转换方法

public DataTable GetExcelTableByOleDB(string strExcelPath, string tableName)
            {
                try
                {
                    DataTable dtExcel = new DataTable();
                    //数据表
                    DataSet ds = new DataSet();
                    //获取文件扩展名
                    string strExtension = System.IO.Path.GetExtension(strExcelPath);
                    string strFileName = System.IO.Path.GetFileName(strExcelPath);
                    //Excel的连接
                    OleDbConnection objConn = null;
                    switch (strExtension)
                    {
                        case ".xls":
                            objConn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + strExcelPath + ";" + "Extended Properties=\"Excel 8.0;HDR=yes;IMEX=1;\"");
                            break;
                        case ".xlsx":
                            objConn = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + strExcelPath + ";" + "Extended Properties=\"Excel 12.0;HDR=yes;IMEX=1;\"");//此连接可以操作.xls与.xlsx文件 (支持Excel2003 和 Excel2007 的连接字符串)  备注: "HDR=yes;"是说Excel文件的第一行是列名而不是数,"HDR=No;"正好与前面的相反。"IMEX=1 "如果列中的数据类型不一致,使用"IMEX=1"可必免数据类型冲突。 
                            break;
                        default:
                            objConn = null;
                            break;
                    }
                    if (objConn == null)
                    {
                        return null;
                    }
                    objConn.Open();
                    //获取Excel中所有Sheet表的信息
                    System.Data.DataTable schemaTable = objConn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, null);
                    //获取Excel的第一个Sheet表名
                    // string tableName1 = schemaTable.Rows[0][2].ToString().Trim();
                    string strSql = "select * from [" + tableName + "$]";
                    //获取Excel指定Sheet表中的信息
                    OleDbCommand objCmd = new OleDbCommand(strSql, objConn);
                    OleDbDataAdapter myData = new OleDbDataAdapter(strSql, objConn);
                    myData.Fill(ds, tableName);//填充数据
                    objConn.Close();
                    //dtExcel即为excel文件中指定表中存储的信息
                    dtExcel = ds.Tables[tableName];
                    return dtExcel;
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message + "\r\n" + ex.StackTrace);
                    return null;
                }
           }

二、将datatable绑定到datagrid
在winfrom环境下此类操作比较简单,但到了wpf下就变得比较复杂,尤其是在MVVM架构下。
这里的绑定关键点是 ObservableCollection<>类型的使用
<>内应用一个和excel表头相同架构的类(ExcelDataModel)

另一个关键点是循环datatable每一行,然后将起哄中每一个单元格放置到一个实体化的ExcelDataModel中,再把ExcelDataModel添加到Source中
三、关于WPF中combox的使用
关于这一块网上有多种方法,大多较为繁琐难懂,这里采用习惯的ObservableCollection<>类型进行绑定

View代码

 <ComboBox x:Name="comboBox" ItemsSource="{Binding PlcCategory}" SelectedItem="{Binding SelectedCpuType,Mode=OneWayToSource}" DisplayMemberPath="Name" Margin="180,346,441,41">

ViewModel代码

        public class CategoryInfo
        {
            public string Name { get; set; }
            public int Value { set; get; }
        }
        public CategoryInfo SelectedCpuType { set; get; }
        public ObservableCollection<CategoryInfo> PlcCategory { get; set; } = new ObservableCollection<CategoryInfo>() { };
         public MainWindowViewModel()//构造函数
        {
            var v = Enum.GetValues(typeof(CpuType));
            foreach (var item in v)
            {
                PlcCategory.Add(new CategoryInfo() { Value=Convert.ToInt32(item),Name=item.ToString()});
            }
        }

关于其中的Enum.GetValues(typeof(CpuType));需要重点说明一下

比如: public enum K
{
x=0,
y,
}

Enum.GetNames()返回的是 : x y
Enum.GetValues() 返回的是:0 1

在本文中
public enum CpuType
{
S7200 = 0,
Logo0BA8 = 1,
S7300 = 10,
S7400 = 20,
S71200 = 30,
S71500 = 40
}
Enum.GetValues(typeof(CpuType))的值应该为 0 1 10 20 30 40
Enum.GetNames则应为前面的PLC型号

注意 这里的GetValues GetName和CategoryInfo的name和value分别代表Enum的名称和值,以及 Combox的选择显示值和选后返回值
-----------结束----------------------------------------
1
1
1
1

1
1
1
1
1

1
1

创建一个表格

一个简单的表格是这么创建的:

项目Value
电脑$1600
手机$12
导管$1

设定内容居中、居左、居右

使用:---------:居中
使用:----------居左
使用----------:居右

第一列第二列第三列
第一列文本居中第二列文本居右第三列文本居左

SmartyPants

SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:

TYPEASCIIHTML
Single backticks'Isn't this fun?'‘Isn’t this fun?’
Quotes"Isn't this fun?"“Isn’t this fun?”
Dashes-- is en-dash, --- is em-dash– is en-dash, — is em-dash

创建一个自定义列表

Markdown
Text-to- HTML conversion tool
Authors
John
Luke

如何创建一个注脚

一个具有注脚的文本。1

注释也是必不可少的

Markdown将文本转换为 HTML

KaTeX数学公式

您可以使用渲染LaTeX数学表达式 KaTeX:

Gamma公式展示 Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Γ(n)=(n1)!nN 是通过欧拉积分

Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t   . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=0tz1etdt.

你可以找到更多关于的信息 LaTeX 数学表达式here.

新的甘特图功能,丰富你的文章

Mon 06 Mon 13 Mon 20 已完成 进行中 计划一 计划二 现有任务 Adding GANTT diagram functionality to mermaid
  • 关于 甘特图 语法,参考 这儿,

UML 图表

可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图:

张三 李四 王五 你好!李四, 最近怎么样? 你最近怎么样,王五? 我很好,谢谢! 我很好,谢谢! 李四想了很长时间, 文字太长了 不适合放在一行. 打量着王五... 很好... 王五, 你怎么样? 张三 李四 王五

这将产生一个流程图。:

链接
长方形
圆角长方形
菱形
  • 关于 Mermaid 语法,参考 这儿,

FLowchart流程图

我们依旧会支持flowchart的流程图:

Created with Raphaël 2.2.0 开始 我的操作 确认? 结束 yes no
  • 关于 Flowchart流程图 语法,参考 这儿.

导出与导入

导出

如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。

导入

如果你想加载一篇你写过的.md文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。


  1. 注脚的解释 ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值