c# comboxbox禁用项选项

本文关键字:选项 comboxbox | 更新日期: 2023-09-27 18:16:56

我正试图为我在一所学校的打印中心编写一个kiosk程序,让学生选择大小和媒体类型,然后让它生成一个价格。我目前正在使用单选按钮进行此操作,但我们正在添加更多选项和下拉列表框将更合适。而且,我计算价格的代码已经失控了。我想把这个设置好,这样计算价格就容易了。设置是这样的:

File1 -纸张大小(9个选项)-媒体类型(18个选项)文件2、文件3等

我打算把它存储在一个3D数组filename[]papersize[]media[]中,用于处理价格。

问题是并不是所有的媒体类型都有所有的大小。我看到你不能禁用列表中的项目。如果您选择一个大小,我可以有选择地填充另一个下拉列表,有或没有项目,但它改变了我的索引号。如果我可以禁用项目,我就可以保持相同的索引,并为处理价格创建一个简单的循环。因为媒体类型是不同的索引,所以现在我必须手动指定和循环每个纸张的大小。

我希望这是有意义的,我不是一个真正的程序员,我只是想做一些简单的东西,以提高我们的工作流程和准确性在打印中心。我可以提供旧程序的屏幕截图和我的新程序的模型,如果它会有所帮助。有人能想到一个更优雅的解决方案吗?

谢谢! !

编辑

啊. .好吧,这比我想象的要困难得多:谢谢大家的意见,非常感谢。我真的没有期望得到任何回应,但确实有很多。谢谢你!我尝试了下面提到的表的想法,但我不确定如何实现它。我将对我所做的尝试发表评论。让我提供更多的细节,以防别人有其他的想法。

举个例子:

尺寸= 8.5x11介质=哑光,双面哑光,光泽,光泽,醋酸盐,简历尺寸= 11x17,介质=相同的减去醋酸盐和resume还有60英寸的卷筒,还有背光介质和各种各样的东西。

8.5x11的价格是1.50,不管纸是什么,然后每张纸都有自己的价格11x17的价格是3.00,每张纸都有自己的价格,比8.5x11的价格要高。

8.5x11 matte = .25
11x17 matte = .50
8.5x11 matte total = 1.75
11x17 matte total = 3.50

我正试着用尽可能少的步骤来做这件事。目前,我的单选按钮占用了大量的屏幕空间,并做了以下事情:当11x17_1。acetate_1检查。禁用等等。同样,为了计算价格,我有数百行代码,比如:

 If(8.5x11_1.Checked)
    {
        If(matte_1.Checked) 
            price = 8.5x11matte_1; 
        if(luster_1.Checked) 
            price = 8.5x11luster_1;
        ...etc.
    }  

卷需要更多的数据(高度)来处理,因为我们对这些按线性英寸收费。目前,对于每个文件,我只有一个高度框,他们需要填写。我可以在新版本的每个文件旁边添加一个高度字段。然后,如果他们选择一个卷,高度框将被填满,这需要更多的if…我现在有几百个。有什么更优雅的方法吗?

我只是没有编程背景来简化它,但我知道这可能可以在使用数组和下拉列表的10行代码中完成:

我已经很长时间没有使用数组了,但我正在考虑这样的东西:

选择[file_1] [combobox_size.Index] [combobox_media.Index]

我想我必须手动定义每个数组值,因为价格是任意的?

[0][0][0] = 1.75
[0][0][1] = 1.75
[0][0][2] = 2.00

等等

我的winform会有12行让他们输入文件名,然后选择下拉列表。如果filename != null,那么我将处理文件和选择的价格。

如果文件1的尺寸是11x17,那么我的数组应该是这样的:

[0][1][3]我将其预定义为$4.00,例如

如果它是滚动,那么我只需乘以所需的高度框。

这个逻辑是合理的还是非常低效的?

编辑# 3

好了,我想差不多了。遗憾的是,我无法找出社区提供的其他解决方案,但我编写了一个"get_index"函数,如下所示:

public static int get_index(string index)
        {
            if (index == "Matte")
                return (1);
            ....
            if (index == "Luster")
                return (3);
            ....
            else
                return (0);
        }
在我的主程序中,我这样定义价格:
for (int x = 0; x < filenum; x++)
            {
                pricegrid[x, 0, 0] = 1.75; // 8.5x11 Resume
                pricegrid[x, 0, 1] = 1.75; // 8.5x11 Matte
                pricegrid[x, 0, 2] = 1.75; // 8.5x11 Double Sided Matte
                pricegrid[x, 0, 3] = 2.35; // 8.5x11 Luster
                .....
            }

然后计算价格,我像这样调用get_index函数:

private void calculate_price()
        {
                getindex[0] = get_index(media1.SelectedItem.ToString());
            ....

        }

c# comboxbox禁用项选项

您应该动态地填充您的ComboBox。你可以使用不依赖于元素数量的SelectedValue来代替SelectedIndex。

在ComboBox
中使用ValueMember

你不应该使用一个三维数组。你需要3张桌子。将所有类型存储在数据库中。
3个表是:
1. 论文
2. 媒体
3.papermedia

。在第一个下拉列表中填充纸张大小。然后,当项目在纸张尺寸中被选中时,您运行查询来填充下拉媒体(您通过交叉表连接)。这样,您将只显示仅适用于此纸张尺寸的媒体。或者你也可以反过来做。这回答你的问题了吗?

有几种方法。你可以创建一个类FileWithDetail来存储

[class File / class paper size / class Mediatype ]

在应用程序开始时初始化列表

List<FileWithDetail> LstFileWithDetail = new FileWithDetail(){...}

然后使用Linq to Object,你可以很容易地查询对象,并根据你选择的值将其绑定到你的组合框

var LstPaperSize = from p in FileWithDetail
                   where p.FileName == SelectedFileName
                   Select ...