点菜吧——随便点 C#生成套餐

news2024/11/15 15:37:20

前言

一到食堂发现有多种选择,但是有一个固定的套路,只能是一个荤,二个小荤,菜品数量也不少,任君选择,如果是一个选择困难症,就有点烦了,所以出品这个自动生成套餐软件。各位老板可以选菜了,还可以拆除一些不想要的菜,不勾选的菜就不会被选择。

一、效果展示

二、代码实现

1、WPF前台代码

<StackPanel x:Name="OptionalMenu" Orientation="Horizontal" Grid.RowSpan="2">
    <GroupBox Header="组别1" x:Name="group1" Margin="0,5,50,0" FontSize="20">
        <ScrollViewer VerticalScrollBarVisibility="Auto" >
            <StackPanel x:Name="groupPanel1"  />
        </ScrollViewer>
       
    </GroupBox>
    <GroupBox Header="组别2" x:Name="group2" Margin="0,5,50,0" FontSize="20">
        <ScrollViewer x:Name="scrList" Margin="0" VerticalScrollBarVisibility="Auto"  >
            <StackPanel x:Name="groupPanel2">

            </StackPanel>
        </ScrollViewer>
        
    </GroupBox>
</StackPanel>

<Button Grid.Column="1" Height="30" Width="100" Click="Button_Click" Background="Cyan" FontSize="20"
        Foreground="ForestGreen">选择</Button>
<RichTextBox Grid.Column="1" Grid.Row="1" Background="BlanchedAlmond" Name="logInfo" FontSize="18">
    
</RichTextBox>

2、后台业务

1)、初始化数据

主要是从XML加载菜单,这个XML后期可以根据实际情况进行调整。

public void InitToolInfo(string filename)
{

    XmlDocument doc = new XmlDocument();
    doc.Load(filename);
    XmlNode xn = doc.SelectSingleNode("Mean");//要读取xml子目录路径
    XmlNodeList xnl = xn.ChildNodes;
    foreach (var item in xnl)
    {
        string sts = "";
        XmlElement xe = (XmlElement)item;
        sts = xe.GetAttribute("id");
        XmlNodeList xnl0 = xe.ChildNodes;
        List<MeanItem> newList = new List<MeanItem>();
        for (int i = 0; i < xnl0.Count; i++)
        {
            string info = xnl0.Item(i).InnerText;
            MeanItem data = new MeanItem(info,sts);
            
            newList.Add(data);

        }
        mainMeanColls[sts] = newList;
    }
}
2)、绑定控件与数据源
private void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
    keys = mainMeanColls.Keys.ToArray();
    if (keys.Length!=2)
    {
        MessageBox.Show("菜单加载异常!");
        return;
    }
    group1.Header = keys[0];
    foreach (var item in mainMeanColls[keys[0]])
    {
        CheckBox checkBox = new CheckBox();
        checkBox.Style =(Style) this.FindResource("ckbStyle");
        checkBox.Content = item.Name;
        LinkContrToObj(checkBox, item);
        groupPanel1.Children.Add(checkBox);
    }
    group2.Header = keys[1];

    foreach (var item in mainMeanColls[keys[1]])
    {
        CheckBox checkBox = new CheckBox();
        checkBox.Style = (Style)this.FindResource("ckbStyle");
        checkBox.Content = item.Name;

        LinkContrToObj(checkBox, item);

        groupPanel2.Children.Add(checkBox);
    }
}
3)、筛选框与源关联
 private void LinkContrToObj(CheckBox box,MeanItem obj)
 {
     var myBinding = new Binding("IsHave")
     {
         Source = obj
     };

     // Bind the data source to the TextBox control's Text dependency property
     box.SetBinding(CheckBox.IsCheckedProperty, myBinding);
 }
4)、选菜逻辑

当然有心的同学可能会发现一个问题,这个选择一个菜品与上一个不重复的逻辑有点哪啥了 ,可以考虑先剔除上菜单中的一个菜品,再去选择这样就发型Whie循环了。

 private void GetResult()
 {
     string res1 = ExecuChoose(mainMeanColls[keys[0]].Where(t => t.IsHave == true).ToList(),1);
     string res2 = ExecuChoose(mainMeanColls[keys[1]].Where(t => t.IsHave == true).ToList(),2);
     string res3 = ExecuChoose(mainMeanColls[keys[1]].Where(t => t.IsHave == true).ToList(),3);
     while (res2==res3)
     {
         res3 = ExecuChoose(mainMeanColls[keys[1]].Where(t => t.IsHave == true).ToList(), 3);
     }
     string res4 = ExecuChoose(mainMeanColls[keys[1]].Where(t => t.IsHave == true).ToList(),4);
     while (res4 == res2||res4==res3)
     {
         res4 = ExecuChoose(mainMeanColls[keys[1]].Where(t => t.IsHave == true).ToList(), 4);
     }
     OutInfo($"结果>>:{keys[0]}-{res1};{keys[1]}-{res2},{res3},{res4}");
 }

 private string ExecuChoose(List<MeanItem> items,int num)
 {
     Random random = new Random(int.Parse(DateTime.Now.ToString("HHmmssfff"))+num);
     int a = random.Next(1, items.Count);
     return items[a - 1].Name;
 }
5)、数据结构

    /// <summary>
    /// 菜单节点项
    /// </summary>
    internal class MeanItem : INotifyPropertyChanged
    {
        public string Name { get; set; }
        private bool isHave;

        public bool IsHave
        {
            get => isHave;
            set
            {
                if (value == isHave)
                {
                    return;
                }
                isHave = value;
                OnPropertyChanged("IsHave");
            }
        }

        public string GroupName { get; set; }

        public MeanItem()
        {
            IsHave = true;
        }

        public MeanItem(string name, string groupName) : this()
        {
            this.Name = name;
            this.GroupName = groupName;
        }

        public MeanItem(string name, bool isHave, string groupName)
            : this(name, groupName)
        {
            this.IsHave = isHave;
        }

        public event PropertyChangedEventHandler PropertyChanged;

        protected void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
            }
        }
    }
6)、XML菜单配置
<?xml version="1.0" encoding="utf-8" ?>

<Mean>
	<group id="大荤">
		<item >土豆牛肉</item>
		<item >红烧鸭块</item>
		<item >梅干菜肉</item>
		<item >狮子头</item>
		<item >蛋饺</item>
		<item >凉拌猪头肉</item>
		<item >口水鸡</item>
		<item >炒猪肝</item>
		<item >回锅肉</item>
		<item >尖椒鸡丁</item>
		<item >青椒猪肚</item>
		<item >排骨</item>
		<item >虾</item>
		<item >香肠</item>
	</group>
	<group id="小荤">
		<item >凉拌豆皮</item>
		<item >凉拌海带</item>
		<item >皮蛋豆腐</item>
		<item >凉拌粉皮</item>
		<item >凉拌黄瓜</item>
		<item >雪菜蚕豆</item>
		<item >红烧豆腐</item>
		<item >毛豆肉丝</item>
		<item >花菜</item>
		<item >竹笋肉丝</item>
		<item >豆芽粉丝</item>
		<item >海鲜菇肉丝</item>
		<item >西葫芦肉丝</item>
		<item >土豆丝</item>
		<item >青菜</item>
		<item >尖椒炒蛋</item>
		<item >芹菜肉丝</item>
		<item >韭菜炒蛋</item>
		<item >包菜</item>
		<item >番茄炒蛋</item>
		<item >凉拌木耳</item>
		<item >青椒香干</item>
		<item >青菜</item>
		<item >尖椒炒蛋</item>
		<item >芹菜肉丝</item>
		<item >韭菜炒蛋</item>
		<item >包菜</item>
		<item >番茄炒蛋</item>
		<item >凉拌木耳</item>
		<item >青椒香干</item>
	</group>
</Mean>

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mysql原理与调优-InnoDB行记录结构

目录 1.绪论 2.InnoDB的记录格式分类 3.compact格式 3.1 基本组成 3.2 记录额外信息 3.2.1 记录额外信息组成 3.2.2 变成字段长度列表 3.2.3 null值列表 3.2.4 记录头信息 3.3 实际记录 3.3.1 溢出页 3.3.2 varchar最多可以储存多少个字符的数据 4.其他记录格式和c…

配置python的基本环境

python的背景知识 python是咋来的&#xff1f; Python 是一种广泛使用的高级编程语言&#xff0c;由 Guido van Rossum 在1989年底发明&#xff0c;第一个公开发行版发行于1991年。Python 的设计哲学强调代码的可读性和简洁的语法&#xff08;尤其是使用空格缩进来区分代码块…

tcpdump使用指南

tcpdump 是一款强大的网络抓包工具&#xff0c;它使用 libpcap 库来抓取网络数据包&#xff0c;这个库在几乎在所有的 Linux/Unix 中都有。 tcpdump src 10.5.2.3 and dst port 3389 # 1. 基于IP地址过滤 # 根据源ip进行过滤 $ tcpdump -i eth2 src 192.168.10.100# 根据目标…

sqli-labs靶场练习(1、5-8关)

自己搭建环境啊喂...http://127.0.0.1/sqli-labs-php7-master/ 第一关 1.单引号判断是否存在注入点 /?id1 2.查询列数 ?id1 order by 3-- ?id1 order by 4-- 由此可判断有3列 3.查询用户名和密码分别在哪列 ?id-1 union select 1,2,3 -- 4.查询数据库名称为security ?…

CC2530组网实验-1

1&#xff0c;ZigBee协议栈 协议是一系列的通信标准&#xff0c;通信双方需要共同按照这一标准进行正常的数据发射和接收。协议栈是协议的具体实现形式&#xff0c;通俗点来理解就是协议栈是协议和用户之间的一个接口&#xff0c;开发人员通过使用协议栈来使用这个协议的&…

生活一地猫毛,空气还有猫浮毛!宠物空气净化器帮你消除这些烦恼

随着换毛季节的到来&#xff0c;铲屎官们如临大敌&#xff0c;猫咪将它们的毛发洒满每一个角落&#xff0c;仿佛室内下起了毛茸茸的飘雪。对于铲屎官来说&#xff0c;这不仅耗费时间的清理任务&#xff0c;更是一场守护健康的保卫战。为此&#xff0c;采取了许多措施来应对猫咪…

STL中的vector以及简单实现

vector的简单介绍&#xff1a; 头文件&#xff1a; #include<vector> vector是属于STL的一员&#xff0c;虽然vector的英文意思是向量&#xff0c;但是vector就是一个顺序表&#xff1b; 对于vector来说&#xff0c;面对string的设计的复杂和冗余&#xff0c;vector就…

Java毕业设计 基于SSM和Vue的图书馆座位预约系统小程序

Java毕业设计 基于SSM和Vue的图书馆座位预约系统小程序 这篇博文将介绍一个基于SSM框架和Vue开发的图书馆座位预约系统微信小程序&#xff0c;适合用于Java毕业设计。 功能介绍 用户 登录 注册 首页 图片轮播 关于我们 公告信息 图书馆信息 图书馆详情 预约选座 收藏 …

Tkinter Designer:拖拽式加速Python Tkinter GUI开发的神器

引言 在Python的世界里&#xff0c;创建美观且功能强大的图形用户界面&#xff08;GUI&#xff09;向来是开发者的挑战之一。Tkinter&#xff0c;作为Python的内置GUI库&#xff0c;虽然功能强大&#xff0c;但在实际使用中&#xff0c;设计和实现GUI的过程往往耗时且繁琐。Tki…

Linux中信号的处理

进程正在递达某一个信号期间&#xff0c;同类型的信号无法被递达&#xff01;&#xff01;&#xff01; 当当前信号正在被捕捉事&#xff0c;系统会自动将当前信号加入到进程的信号屏蔽字&#xff08;block&#xff09;。 当信号完成捕捉动作&#xff0c;系统又会自动解除对该…

R语言BIOMOD2 及机器学习方法的物种分布模拟与案例分析

BIOMOD2是一个R软件包&#xff0c;用于构建和评估物种分布模型&#xff08;SDMs&#xff09;。它集成了多种统计和机器学习方法&#xff0c;如GLM、GAM、SVM等&#xff0c;允许用户预测和分析物种在不同环境条件下的地理分布。通过这种方式&#xff0c;BIOMOD帮助研究者评估气候…

Linux-理解shell

文章目录 5. 理解shell5.1 shell的类型5.2 交互shell和系统默认shell5.3 安装zsh shell程序5.4 shell的父子关系5.5 命令列表5.6 命令分组5.7 使用命令分组创建子shell5.8 子shell用法5.9 shell的非内建命令和内建命令5.9.1 非内建命令5.9.2 内建命令5.9.3 history和alias命令介…

Cornerstone加载本地Dicom文件第二弹 - Blob篇

&#x1f340; 引言 当我们刚接触Cornerstone或拿到一组Dicom文件时&#xff0c;如果没有ImageID和后台接口&#xff0c;可能只是想简单测试Cornerstone能否加载这些Dicom文件。在这种情况下&#xff0c;可以使用本地文件加载的方法。之前我们介绍了通过node启动服务器请求文件…

cuda pytorch安装详细教程 GPU版

1.先安装anaconda Anaconda 1.1这里用了最简单的方法&#xff0c;后面将pytorch直接安装到base配置下面了。 1.2下载安装&#xff0c;全部勾选。 一定添加文件夹到path中去&#xff0c;否则后面下载pytorch&#xff0c;无法传输。 1.3 通过cmd&#xff0c;输入conda --versio…

CSP-J 模拟题2

如果x大于45&#xff0c;则输出-1 设定一个整数now&#xff0c;他的初始值为9&#xff1b; 当x>now&#xff0c;就x-now&#xff0c;并且now--; 根据解析写代码1&#xff1a; #include <bits/stdc.h> using namespace std; int a[101010]; int main(){int x;cin>…

设计师必备网站,素材、灵感一手抓

设计师都在哪些地方找素材&#xff0c;找灵感&#xff1f;分享8个设计师必备网站&#xff0c;素材免费下载&#xff0c;还能看到很多国内外大神的设计之作&#xff0c;赶紧收藏起来吧~ 1、baotu 包图网_专注原创商用设计图片下载&#xff0c;会员免费设计素材模板独家图库 国内…

QChart笔记7:基于QPolarChart的雷达图、能力图

六边形战士这个词经常听说&#xff0c;用来描述这个词的是六边形雷达图/能力图。在网上搜索如何用QChart实现没有找到&#xff0c;于是就自己研究出一种写法。 先看看效果&#xff1a; 可以用这个图表示游戏中的人物属性&#xff0c;看看我的几个不太厉害的NPC。 在QT自带的实…

STL—容器—list【list的介绍和基本使用】【list的迭代器失效问题】

STL—容器—list list的使用并不难&#xff0c;有了之前使用string和vector的基础后&#xff0c;学习起来并不难。因此这里不在详细的讲解如何使用&#xff0c;而是大致的将其基本接口都熟悉一下 1.list介绍 list的文档介绍 list是可以在常数范围内在任意位置进行插入和删除…

解决App推广难题,Xinstall带你实现一键唤起,提升用户转化率!

在移动互联网时代&#xff0c;App的推广和运营成为了开发者们面临的一大挑战。如何让用户在各种场景下快速、便捷地唤起你的App&#xff0c;提升用户转化率和活跃度呢&#xff1f;今天&#xff0c;就让我们一起来了解一下Xinstall这一神奇的助手&#xff0c;它将如何解决这些痛…

基于YOLOv10和半监督学习的小麦麦穗检测算法:YOLOv10_ssod

基于YOLOv10和半监督学习的小麦麦穗检测算法&#xff1a;YOLOv10_ssod 1.引言2.数据集2.1 公共数据集2.2 自制数据集 3.YOLOv10算法及改进3.1 YOLOv10原版算法3.2 YOLOv10算法改进3.3 对比实验 4.半监督学习方法5.训练效果5.1最终检测效果5.2YOLOv10的精度曲线图5.3 半监督YOLO…