关于开发C# WinForms 应用程序的方法介绍

devtools/2024/12/22 8:49:36/

前提:首先默认大家已经有了一个完整的项目,并且现在所需的是进行C#界面的开发设计。

本文介绍的项目是使用C++与C#联合开发的客户端软件

1 首先定义一个窗体类:

定义了一个窗体类 Formxxxxxxxx,该窗体类继承自 EF.EFFormMain。该窗体主要功能是从某个服务中查询数据,并将查询结果显示在一个数据表格中。下面是对代码的逐步解析:

命名空间和引用:

using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

这些 using 指令导入了 C# 中常用的命名空间,涵盖了:

  • System.Data:数据访问相关的类,如 DataTableDataSet 等。
  • System.Drawing:用于图形绘制(如绘制控件、表格样式等)。
  • System.Linq:用于支持 LINQ 查询操作(如集合查询)。
  • System.Text:用于字符串操作(如 StringBuilder)。
  • System.Windows.Forms:Windows Forms 控件库,用于创建 GUI 窗体。

2 窗体类及构造函数:

public partial class Formxxxxxxxx : EF.EFFormMain
{EI.EIInfo inBlock = new EI.EIInfo();EI.EIInfo outBlock = new EI.EIInfo();public Formxxxxxxxx(){InitializeComponent();ShowPrio();}
}
  • Formxxxxxxxx 类:继承自 EF.EFFormMain 类,表示一个 Windows 窗体。这个窗体的主要作用是通过调用服务接口来查询数据,并显示查询结果。
  • 构造函数:在窗体初始化时,InitializeComponent() 方法会被调用,它是自动生成的,通常用于初始化窗体上的控件。接着,ShowPrio() 方法被调用,它用于执行数据查询和显示操作。

3 ShowPrio() 方法:(其中的数据库表中的参数及字段就使用para表示变量,大家可以根据实际情况自行修改)

private void ShowPrio()
{EI.EIInfo outblk = new EI.EIInfo();this.outBlock = EI.EIManager.Instance.CallService("解决方案名称", "c++后端文件.cpp", inBlock);if (outBlock.sys_info.flag == 0){outblk.Tables[0].Columns.Add("para1");outblk.Tables[0].Columns.Add("para2");outblk.Tables[0].Columns.Add("para3");outblk.Tables[0].Columns.Add("para4");outblk.Tables[0].Columns.Add("para5");outblk.Tables[0].Columns.Add("para6");outblk.Tables[0].Columns.Add("para7");outblk.Tables[0].Columns.Add("para8");outblk.Tables[0].Columns.Add("para9");for (int i = 0; i < outBlock.Tables[0].Rows.Count; i++){DataRow dataRow = outblk.Tables[0].NewRow();dataRow["para1"] = outBlock.Tables[0].Rows[i]["ST_NO"].ToString();dataRow["para2"] = outBlock.Tables[0].Rows[i]["PSR"].ToString();dataRow["para3"] = outBlock.Tables[0].Rows[i]["APN"].ToString();dataRow["para4"] = outBlock.Tables[0].Rows[i]["THICK_MIN"].ToString();dataRow["para5"] = outBlock.Tables[0].Rows[i]["THICK_MAX"].ToString();dataRow["para6"] = outBlock.Tables[0].Rows[i]["WIDTH_MIN"].ToString();dataRow["para7"] = outBlock.Tables[0].Rows[i]["WIDTH_MAX"].ToString();dataRow["para8"] = outBlock.Tables[0].Rows[i]["SG_SIGN"].ToString();dataRow["para9"] = outBlock.Tables[0].Rows[i]["HARD_GROUP"].ToString();outblk.Tables[0].Rows.Add(dataRow);}this.efDevGrid1.DataSource = outblk.Tables[0];this.gridView1.BestFitColumns();}else{EF.EFMessageBox.Show(outBlock.sys_info.msg);}
}
  • EI.EIInfo outblk = new EI.EIInfo();:创建一个新的 EI.EIInfo 对象 outblk,用于存储查询结果。

  • this.outBlock = EI.EIManager.Instance.CallService("解决方案名称", "c++后端文件.cpp", inBlock);

    • 通过 EI.EIManager.Instance.CallService() 方法调用某个服务接口,传入 inBlock 作为请求参数,获得 outBlock 作为响应结果。
    • "解决方案""c++后端文件.cpp" 是该服务的标识符和操作名称,表示从某个系统中查询数据。
    • inBlockoutBlock 都是 EI.EIInfo 类型,可能包含多种信息和数据表。
  • if (outBlock.sys_info.flag == 0):判断 outBlocksys_info.flag 是否为 0,表示是否成功接收到有效的响应数据。如果 flag 为 0,表示成功。

4 添加数据列:

outblk.Tables[0].Columns.Add("para1");
outblk.Tables[0].Columns.Add("para2");
outblk.Tables[0].Columns.Add("para3");
outblk.Tables[0].Columns.Add("para4");
outblk.Tables[0].Columns.Add("para5");
outblk.Tables[0].Columns.Add("para6");
outblk.Tables[0].Columns.Add("para7");
outblk.Tables[0].Columns.Add("para8");
outblk.Tables[0].Columns.Add("para9");

这些代码行是向 outblk 中的数据表(Tables[0])添加新的列,这些列描述了目标项目表中的不同参数等。

5 添加数据行:

for (int i = 0; i < outBlock.Tables[0].Rows.Count; i++)
{DataRow dataRow = outblk.Tables[0].NewRow();dataRow["para"] = outBlock.Tables[0].Rows[i]["ST_NO"].ToString();// 其他字段填充...outblk.Tables[0].Rows.Add(dataRow);
}

这部分代码循环遍历 outBlock.Tables[0].Rows 中的数据行,提取各个字段的值,并将这些值填充到 outblk 中的对应数据行。

6 绑定数据到控件

this.efDevGrid1.DataSource = outblk.Tables[0];
this.gridView1.BestFitColumns();

将填充完的数据表绑定到 efDevGrid1 控件,并调用 BestFitColumns() 方法自动调整列宽。

EF.EFMessageBox.Show(outBlock.sys_info.msg);

如果 flag 不为 0,表示查询失败,弹出消息框显示错误信息。

7 事件处理方法

private void efDevGrid1_Click(object sender, EventArgs e)
{}private void efDevGrid1_Click_1(object sender, EventArgs e)
{}

这两个方法是 efDevGrid1 控件的点击事件处理程序,但目前它们是空的,后续我们可以加入一些处理逻辑,设定一些摁键处理规则等。


http://www.ppmy.cn/devtools/144325.html

相关文章

SQL 插入数据详解

本文介绍如何利用 SQL 的 INSERT 语句将数据插入表中。 1. 数据插入 顾名思义&#xff0c;INSERT 用来将行插入&#xff08;或添加&#xff09;到数据库表。插入有几种方式&#xff1a; 插入完整的行&#xff1b;插入行的一部分&#xff1b;插入某些查询的结果。 下面逐一介…

QT实战经验总结 连载中

QT实战经验总结 在看书系统学习后&#xff0c;就开始实战了&#xff0c;会遇到很多问题1.信号和槽的思考2.在python 或 C 代码中&#xff0c;对 QML 代码中控件的调用3.关于在一个窗口上不断打开新窗口 在看书系统学习后&#xff0c;就开始实战了&#xff0c;会遇到很多问题 p…

Apache 如何监听多个端口 ?

Apache 是一个广泛使用的 web 服务器&#xff0c;可以配置为侦听多个端口。这对于托管多个网站、运行不同类型的服务或改进服务器的可访问性特别有用。在本文中&#xff0c;我们将探讨配置 Apache 以侦听多个端口的步骤。 Step 1: Access Apache Configuration File 找到并打…

uboot 打开log 的 方法

uboot 版本 commit f919c3a889f0ec7d63a48b5d0ed064386b0980bd (HEAD -> v2024.10, tag: v2024.10) Author: Tom Rini <trinikonsulko.com> Date: Mon Oct 7 08:54:35 2024 -0600 Prepare v2024.10 Signed-off-by: Tom Rini <trinikonsulko.com> 开启的选项…

Vue2/3 生命周期详细对比与使用指南

Vue 2 生命周期 Vue 2 中,生命周期是指组件实例在创建、挂载、更新、销毁时所经历的一系列过程。以下是 Vue 2 的生命周期图和主要钩子函数的描述: Vue 2 生命周期钩子 beforeCreate:实例初始化之后调用,数据观测和事件配置尚未完成。常用于初始化逻辑。created:实例创建…

文件防泄漏 | 文件防泄漏软件解决方案分享,网络数据泄露防护系统

文件防泄漏 | 文件防泄漏软件解决方案分享&#xff0c;网络数据泄露防护系统 企业面临的一大挑战是数据安全和隐私保护。 网络数据泄露不仅会导致经济损失&#xff0c;还会损害企业的声誉和客户关系。 为了应对这一挑战&#xff0c;域智盾软件应运而生&#xff0c;成为众多企…

【Flutter_Web】Flutter编译Web第二篇(webview篇):flutter_inappwebview如何改造方法,变成web之后数据如何交互

前言 欢迎来到第二篇文章&#xff0c;这也是第二个难题&#xff0c;就是原有的移动端本身一些页面H5的形式去呈现&#xff08;webview&#xff09;&#xff0c;例如某些需要动态更换内容的页面&#xff0c;某些活动页面、支付页面&#xff0c;不仅仅做页面呈现&#xff0c;还包…

2024年11月 蓝桥杯青少组 STEMA考试 Scratch真题

2024年11月 蓝桥杯青少组 STEMA考试 Scratch真题&#xff08;选择题&#xff09; 题目总数&#xff1a;5 总分数&#xff1a;50 选择题 第 1 题 单选题 Scratch运行以下程宇后&#xff0c;小兔子会&#xff08; &#xff09;。 A. 变小 B. 变大 C. 变色 D. …