C#combobox禁用项目替代?

时间:2011-12-05 22:30:41

标签: c# winforms combobox

我正在学校为我的打印中心编写一个自助服务终端程序,供学生选择尺寸和媒体类型,然后让它产生价格。我目前正在使用单选按钮,这可以正常工作,但我们正在添加更多选项,下拉列表框更合适。此外,我的计算价格代码失控。我想设置它,以便计算价格应该很容易。安装程序是这样的:

File1 - 纸张尺寸(9个选项) - 介质类型(18个选项) File2,File 3等

我打算将它存储在3D数组文件名[] papersize [] media []中以便处理价格。

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

我希望这是有道理的,我不是真正的程序员,我只是想简单地改进我们在打印中心的工作流程和准确性。如果有帮助,我可以提供旧程序的屏幕截图和我的新程序的模型。谁能想到更优雅的解决方案呢?

谢谢!

修改

Yikes ..好吧,这最终会比我预期的更难:感谢大家的投入,非常感谢。我真的没有期待任何回应,而且有很多。谢谢。我尝试了下面提到的表格想法,但我不确定如何实现它。我将根据我的尝试评论该帖子。如果其他人有其他想法,请让我提供更多细节。

例如我要做的事情:

尺寸= 8.5x11有介质=哑光,双面哑光,光泽,光泽,醋酸纤维素,简历 大小= 11x17有media =相同减去醋酸盐并恢复 等等,高达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.Checked acetate_1.Disable等。另外,为了计算价格,我有数百行代码执行以下操作:

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

Rolls需要处理更多数据(高度),因为我们为这些数据充电线性英寸。目前,对于每个文件,我只有一个他们需要填写的高度框。我可以在我的新版本的每个文件旁边放一个高度字段。然后如果他们选择了一个掷骰子,那么就会填充高度框胸围,这需要更多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 gloss,那么我的数组将是:

[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());

            ....


        }

3 个答案:

答案 0 :(得分:1)

您不应该使用一个三维数组。你需要3个表。将所有类型存储在数据库中 3表是:
纸 媒体
3. papermedia

如此。你用纸张填充第一个下拉列表。 然后,当在文件大小中选择项目时,您运行查询以填充下拉媒体(您通过交集表加入)。这样,您只会显示仅适用于此文件大小的媒体。或者你可以做相反的事情。 这是否回答了你的问题?

答案 1 :(得分:1)

有几种方法可以做到这一点。 您可以创建一个存储

的类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 ...   

答案 2 :(得分:1)

您应该像动态一样动态填充ComboBox。 您可以使用不依赖于元素数量的SelectedValue,而不是使用SelectedIndex。

例如参见:Using ValueMember in ComboBox