C#高级:Winform中的自定义窗体输入

目录

一、多样式输入(无封装)

1.代码

2.效果 

二、单输入框封装

1.使用

2.封装

3.效果

三、组合框批量输入封装

1.使用

2.封装

3.效果


一、多样式输入(无封装)

1.代码

private async void button1_Click(object sender, EventArgs e)
{
    // 在方法中直接创建一个新的窗体
    Form inputForm = new Form
    {
        Text = "输入对话框",
        Width = 300,
        Height = 300,
        MaximizeBox  = false,
        StartPosition = FormStartPosition.CenterScreen
    };

    // 创建控件
    Label textlabel = new Label { Text = "文本输入:", Width =80,Location = new System.Drawing.Point(20, 15) };
    TextBox textBox = new TextBox { Location = new System.Drawing.Point(110, 10), Width = 150 };
    CheckBox checkBox = new CheckBox { Text = "是否选中", Location = new System.Drawing.Point(20, 60) };
    RadioButton radioButton1 = new RadioButton { Text = "选项 1", Location = new System.Drawing.Point(20, 100), Checked = true };
    RadioButton radioButton2 = new RadioButton { Text = "选项 2", Location = new System.Drawing.Point(130, 100) };
    ComboBox comboBox = new ComboBox
    {
        Location = new System.Drawing.Point(20, 140),
        Width = 200,
        Items = { "选项 A", "选项 B", "选项 C" }
    };
    comboBox.SelectedIndex = 0; // 默认选中第一项

    NumericUpDown numericUpDown = new NumericUpDown
    {
        Location = new System.Drawing.Point(20, 180),
        Width = 200,
        Minimum = 0,
        Maximum = 100,
        Value = 10
    };

    // 创建确认按钮
    Button btnOK = new Button
    {
        Text = "确定",
        Height=30,
        Location = new System.Drawing.Point(20, 220)
    };
    btnOK.Click += (s, args) =>
    {
        // 获取控件的值
        string textBoxInput = textBox.Text;
        bool checkBoxChecked = checkBox.Checked;
        string radioButtonSelection = radioButton1.Checked ? "选项 1" : "选项 2";
        string comboBoxSelection = comboBox.Text;
        decimal numericValue = numericUpDown.Value;

        // 显示结果
        MessageBox.Show($"你输入的内容:\n" +
            $"文本框: {textBoxInput}\n" +
            $"复选框: {checkBoxChecked}\n" +
            $"单选框: {radioButtonSelection}\n" +
            $"下拉框: {comboBoxSelection}\n" +
            $"数字框: {numericValue}");

        // 关闭窗体
        inputForm.Close();
    };

    // 创建取消按钮
    Button btnCancel = new Button
    {
        Text = "取消",
        Height = 30,
        Location = new System.Drawing.Point(120, 220)
    };
    btnCancel.Click += (s, args) =>
    {
        // 取消操作,关闭窗体
        inputForm.Close();
    };

    // 将控件添加到窗体
    inputForm.Controls.Add(textlabel);
    inputForm.Controls.Add(textBox);
    inputForm.Controls.Add(checkBox);
    inputForm.Controls.Add(radioButton1);
    inputForm.Controls.Add(radioButton2);
    inputForm.Controls.Add(comboBox);
    inputForm.Controls.Add(numericUpDown);
    inputForm.Controls.Add(btnOK);
    inputForm.Controls.Add(btnCancel);

    // 显示窗体
    inputForm.ShowDialog();
}

2.效果 

二、单输入框封装

1.使用

异步方法返回结果需要通过.Result获取

//点击触发自定义弹窗输入
private async void button1_Click(object sender, EventArgs e)
{
    var result = GetTextInput("请输入您的尊姓大名").Result;
}

2.封装

//新建自定义窗体,输入提示语,是否采用文本框(false=采用数字框)
private async Task<string> GetTextInput(string laebl,bool isUseTextBox=true)
{
    //多少个输入框:
    var InputLength = laebl.Length;
    int labelwidth = InputLength * 20 + 5;

    // 在方法中直接创建一个新的窗体
    Form inputForm = new Form
    {
        Text = "请输入",
        Width = labelwidth+300,
        Height = 180,
        MaximizeBox = false,
        StartPosition = FormStartPosition.CenterScreen
    };

    // 创建控件
    
    Label label = new Label { Text = laebl + ":", Width = labelwidth, Location = new System.Drawing.Point(20, 23), BackColor = Color.Transparent };
    TextBox textBox = new TextBox();
    NumericUpDown numericUpDown = new NumericUpDown();
    inputForm.Controls.Add(label);
    int input_x = labelwidth + 20;
    if (isUseTextBox)
    {
        textBox  = new TextBox { Location = new System.Drawing.Point(input_x, 20), Width = 200 };
        inputForm.Controls.Add(textBox);
    }
    else
    {
        numericUpDown = new NumericUpDown
        {
            Location = new System.Drawing.Point(input_x, 20),
            Width = 200,
            Minimum = 0,
            Maximum = 100000000000,
            Value = 1
        };
        inputForm.Controls.Add(numericUpDown);
    }


    // 创建确认按钮
    Button btnOK = new Button
    {
        Text = "确定",
        Height = 30,
        Location = new System.Drawing.Point(input_x, 70)
    };
    string result = "";
    btnOK.Click += (s, args) =>
    {
        //结果赋值
        result = isUseTextBox ? textBox.Text : numericUpDown.Value.ToString();
        // 关闭窗体
        inputForm.Close();
    };

    // 创建取消按钮
    Button btnCancel = new Button
    {
        Text = "取消",
        Height = 30,
        Location = new System.Drawing.Point(input_x+100, 70)
    };
    btnCancel.Click += (s, args) =>
    {
        // 取消操作,关闭窗体
        inputForm.Close();
    };

    // 将btn控件添加到窗体
    inputForm.Controls.Add(btnOK);
    inputForm.Controls.Add(btnCancel);

    // 显示窗体
    inputForm.ShowDialog();
    return result;
}

3.效果

三、组合框批量输入封装

1.使用

异步方法返回结果需要通过.Result获取

 //点击触发自定义弹窗输入
 private async void button1_Click(object sender, EventArgs e)
 {
     List<Dictionary<string, List<string>>> list = new List<Dictionary<string, List<string>>>
     {
         new Dictionary<string, List<string>> { { "选择一", new List<string> { "1", "2", "3" } } },
         new Dictionary<string, List<string>> { { "选择二", new List<string> { "4", "5", "6" } } },
         new Dictionary<string, List<string>> { { "选择三", new List<string> { "7", "8", "9" } } }
     };
     var result = GetComboboxInput(list).Result;
 }

2.封装

//新建自定义窗体,提示语:输入框选项
private async Task<List<string>> GetComboboxInput(List<Dictionary<string, List<string>>> list)
{
    //多少个输入框:
    var InputCount = list.Count;
    var InputLabels = list.SelectMany(x => x.Keys).ToList();
    var InputValues = list.SelectMany(x => x.Values).ToList();
    int addheight = 50;

    // 在方法中直接创建一个新的窗体
    Form inputForm = new Form
    {
        Text = "请输入",
        Width = 350,
        Height = InputCount * addheight + 130,
        MaximizeBox = false,
        StartPosition = FormStartPosition.CenterScreen
    };

    // 创建控件
    List<Label> LaeblList = new List<Label>();
    List<ComboBox> ComboBoxList = new List<ComboBox>();
    int y = 20;
    for (int i = 0; i < InputCount; i++)
    {
        Label en_label = new Label { Text = InputLabels[i] + ":", Width = 80, Location = new System.Drawing.Point(20, y+3),BackColor=Color.Transparent };
        ComboBox en_com = new ComboBox { DataSource = InputValues[i], Width = 200, Location = new System.Drawing.Point(100, y) };
        LaeblList.Add(en_label);
        ComboBoxList.Add(en_com);
        inputForm.Controls.Add(en_label);
        inputForm.Controls.Add(en_com);
        y += addheight;

    }

    // 创建确认按钮
    int btn_y = InputCount * addheight + 20;
    Button btnOK = new Button
    {
        Text = "确定",
        Height = 30,
        Location = new System.Drawing.Point(80, btn_y)
    };
    List<string> result = new List<string>();
    btnOK.Click += (s, args) =>
    {
        //结果赋值
        result = ComboBoxList.Select(x => x.Text).ToList();
        // 关闭窗体
        inputForm.Close();
    };

    // 创建取消按钮
    Button btnCancel = new Button
    {
        Text = "取消",
        Height = 30,
        Location = new System.Drawing.Point(180, btn_y)
    };
    btnCancel.Click += (s, args) =>
    {
        // 取消操作,关闭窗体
        inputForm.Close();
    };

    // 将btn控件添加到窗体
    inputForm.Controls.Add(btnOK);
    inputForm.Controls.Add(btnCancel);

    // 显示窗体
    inputForm.ShowDialog();
    return result;
}
如果输入的label太长,请手动调节窗体宽度、combobox的x坐标

3.效果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/920850.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用GDB或Delve对已经运行起来的Go程序进行远程调试

同步发布在我的博客&#xff0c;欢迎来点赞。 使用 GDB 或 Delve 对已经运行起来的 Go 程序进行远程调试 使用 GDB 或 Delve 对已经运行起来的 Go 程序进行远程调试 背景 Java 程序可以很方便地通过 jdwp 参数指定一个对外端口进行远程调试&#xff0c;如 java \ -agentlib…

简单实现QT对象的[json]序列化与反序列化

简单实现QT对象的[json]序列化与反序列化 简介应用场景qt元对象系统思路实现使用方式题外话 简介 众所周知json作为一种轻量级的数据交换格式&#xff0c;在开发中被广泛应用。因此如何方便的将对象数据转为json格式和从json格式中加载数据到对象中就变得尤为重要。 在python类…

Java开发经验——开发常用工具类

摘要 本文介绍了Java开发中常用的工具类&#xff0c;包括Apache Commons Collections的SetUtils、Google Guava的Sets、Apache Commons Lang的ArrayUtils等&#xff0c;以及它们在集合操作、数组操作、字符串处理、JSON处理等方面的应用。文章还涉及了Optional类、Money工具类…

esp32c3开发板通过micropython的mqtt库连MQTT物联网消息服务器

MQTT介绍 MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一种轻量级的消息协议&#xff0c;旨在设备之间进行通信&#xff0c;尤其是在网络条件较差的情况下。MQTT v3.1.1 和 MQTT v5 是该协议的两个主要版本。 MQTT v3.1.1&#xff1a; 优点&#xff…

【IDE】使用指南

定期更新实用技能&#xff0c;建议关注收藏点赞。 友情链接&#xff1a; 点击跳转常见代码编辑器的报错解决方案 目录 常用快捷键pycharm右下角边栏脚本头安装IDE的插件git配置TODO 代码编辑器里有许多小技巧&#xff0c;便于办公。本篇主要以pycharm,vscode等主流常用IDE为…

OpenGL入门009——漫反射在片段着色器中的应用

本节将在片段着色器中应用漫反射 文章目录 一些概念漫反射 实战简介dependenciesshadervsshader.fs utilsCube.cpp main.cppCMakeLists.txt最终效果 一些概念 漫反射 概述&#xff1a; 描述的是粗糙表面对光的反射&#xff0c;反射的光线相关各个方向均匀分布&#xff0c;与视…

删库跑路,启动!

起因&#xff1a;这是一个悲伤的故事&#xff0c;在抓logcat时 device待机自动回根目录了&#xff0c;而题主对当前路径的印象还停留在文件夹下&#xff0c;不小心在根目录执行了rm -rf * … 所以&#xff0c;这是个悲伤的故事&#xff0c;东西全没了…device也黑屏了&#xff…

Ubuntu下的Eigen库的安装及基本使用教程

一、Eigen库介绍 简介 Eigen [1]目前最新的版本是3.4&#xff0c;除了C标准库以外&#xff0c;不需要任何其他的依赖包。Eigen使用的CMake建立配置文件和单元测试&#xff0c;并自动安装。如果使用Eigen库&#xff0c;只需包特定模块的的头文件即可。 基本功能 Eigen适用范…

OpenCV与AI深度学习|16个含源码和数据集的计算机视觉实战项目(建议收藏!)

本文来源公众号“OpenCV与AI深度学习”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;分享&#xff5c;16个含源码和数据集的计算机视觉实战项目 本文将分享16个含源码和数据集的计算机视觉实战项目。具体包括&#xff1a; 1. 人…

MySQL win安装 和 pymysql使用示例

目录 一、MySQL安装 下载压缩包&#xff1a; 编写配置文件&#xff1a; 配置环境变量&#xff1a; 初始化服务和账户 关闭mysql开机自启&#xff08;可选&#xff09; 建议找一个数据库可视化软件 二、使用pymysql操作数据库 安装pymysql 示例代码 报错处理 一、My…

springboot基于微信小程序的停车场管理系统

摘 要 停车场管理系统是一种基于移动端的应用程序&#xff0c;旨在方便车主停车的事务办理。该小程序提供了便捷的停车和功能&#xff0c;使车主能够快速完成各项必要的手续和信息填写。旨在提供一种便捷、高效的预约停车方式&#xff0c;减少停车手续的时间和精力成本。通过该…

js:数组转换为字符串

1、使用join 通过join&#xff0c;将数组拼接&#xff0c;使用&#xff0c;进行分割 let array [a, b, c] let str array.join(,); console.log(str) 2、使用toString() const array [a, b, c] const string array.toString() console.log(string) 3、使用扩展运算符和…

npm上传自己封装的插件(vue+vite)

一、npm账号及发包删包等命令 若没有账号&#xff0c;可在npm官网&#xff1a;https://www.npmjs.com/login 进行注册。 在当前项目根目录下打开终端命令窗口&#xff0c;常见命令如下&#xff1a; 1、登录命令&#xff1a;npm login&#xff08;不用每次都重新登录&#xff0…

路由缓存后跳转到新路由时,上一路由中的tip信息框不销毁问题解决

上一路由tip信息框不销毁问题解决 路由缓存篇问题描述及截图解决思路关键代码 路由缓存篇 传送门 问题描述及截图 路由缓存后跳转新路由时&#xff0c;上一个路由的tip信息框没销毁。 解决思路 在全局路由守卫中获取DOM元素&#xff0c;通过css去控制 关键代码 修改文…

uni-app 界面TabBar中间大图标设置的两种方法

一、前言 最近写基于uni-app 写app项目的时候&#xff0c;底部导航栏 中间有一个固定的大图标&#xff0c;并且没有激活状态。这里记录下实现方案。效果如下&#xff08;党组织这个图标&#xff09;&#xff1a; 方法一&#xff1a;midButton的使用 官方文档&#xff1a;ta…

Apple Vision Pro开发003-PolySpatial2.0新建项目

unity6.0下载链接:Unity 实时开发平台 | 3D、2D、VR 和 AR 引擎 一、新建项目 二、导入开发包 com.unity.polyspatial.visionos 输入版本号 2.0.4 com.unity.polyspatial&#xff08;单独导入&#xff09;&#xff0c;或者直接安装 三、对应设置 其他的操作与之前的版本相同…

xiaolin coding 图解网络笔记——基础篇

基础篇 Linux 系统是如何收发网络包的&#xff1f; 网络模型 为了使多种设备能通过网络相互通信&#xff0c;和为了解决不同设备在网络互连中的兼容性问题&#xff0c;国际标准化组织制定了开放式系统互连通信参考模型&#xff08;Open System Interconnection Reference Mo…

【vba源码】导入excel批注信息

Hi&#xff0c;大家好呀&#xff01; 又到了一周一分享的时间&#xff0c;上周繁忙的我都没有给大家直播&#xff0c;视频也没更新&#xff0c;那这周大家放心&#xff0c;都会给大家更新&#xff0c;今天我们来讲点啥呢&#xff1f;每周找优质的内容给大家更新是我最最痛苦的…

跨平台WPF框架Avalonia教程 十三

AutoCompleteBox 自动补全输入框 自动补全输入框提供了一个供用户输入的文本框和一个包含可能匹配项的下拉列表。下拉列表会在用户开始输入时显示&#xff0c;并且每输入一个字符&#xff0c;匹配项都会更新。用户可以从下拉列表中选择匹配项。 文本与可能项匹配的方式是可配…

MATLAB实现GARCH(广义自回归条件异方差)模型计算VaR(Value at Risk)

MATLAB实现GARCH(广义自回归条件异方差)模型计算VaR(Value at Risk) 1.计算模型介绍 使用GARCH&#xff08;广义自回归条件异方差&#xff09;模型计算VaR&#xff08;风险价值&#xff09;时&#xff0c;方差法是一个常用的方法。GARCH模型能够捕捉到金融时间序列数据中的波…