C # comboxbox отключить элемент альтернативы? - PullRequest
2 голосов
/ 06 декабря 2011

Я пытаюсь написать программу киоска для своего печатного центра в школе, чтобы ученики могли выбрать размер и тип носителя, а затем сделать так, чтобы он определил цену.В настоящее время я делаю это с переключателями, которые работают нормально, но мы добавляем еще много опций, и более подходящим будет раскрывающийся список.Кроме того, мой код для расчета цены выходит из-под контроля.Я хотел бы настроить это так, чтобы расчет цены был простым.Настройка выглядит примерно так:

Файл1 - Размер бумаги (9 вариантов) - Тип носителя (18 параметров) Файл2, Файл 3 и т. Д.

Я собирался сохранить это в трехмерном массивеимя_файла [] paperize [] media [] для обработки цены.

Проблема в том, что не все типы носителей доступны во всех размерах.Я вижу, что вы не можете отключить элементы в списке.Если вы выберете один размер, я могу выборочно заполнить другой выпадающий список элементами или без них, но это изменит мои порядковые номера.Если бы я мог отключить товары, я мог бы сохранить тот же индекс и сделать простой цикл для обработки цен.Как и сейчас, мне пришлось бы вручную указывать и зацикливать для каждого размера бумаги, так как типы носителей имеют разные индексы.

Надеюсь, это имеет смысл, я на самом деле не программист, я просто пытаюсь что-то сделатьпросто улучшить наш рабочий процесс и точность в центре печати.Я могу предоставить скриншот старой программы и макет моей новой программы, если это поможет.Кто-нибудь может придумать более элегантное решение для этого?

Спасибо !!

РЕДАКТИРОВАТЬ

Yikes .. Ладно, это становится сложнее, чем яОжидая: Спасибо всем за ваш вклад, это очень ценится.Я действительно не ожидал никаких ответов, и их было много.Благодарю вас.Я попробовал идею таблицы, упомянутую ниже, но я не совсем уверен, как реализовать ее.Я прокомментирую этот пост за то, что я пытался.Позвольте мне представить более подробную информацию в случае, если у кого-то есть другая идея.

Например, что я пытаюсь сделать:

Размер = 8,5x11 имеет media = matte, двухсторонний matte,блеск, глянец, ацетат, резюме Размер = 11x17 имеет материал = тот же минус ацетат и резюме и т. д., до 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 ацетат_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 строках кода с использованием массива и выпадающих списков.:

Прошло много времени с тех пор, как я использовал массивы, но я думал о чем-то вроде:

Selection [file_1] [combobox_size.Index] [combobox_media.Index]

Я думаю, мне придется вручную определять каждое значение массива, так как цены являются произвольными?

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

И т. Д.

Моя форма win будет иметь, скажем, 12 строк, чтобы они могли ввестиимя файла, а затем выберите раскрывающиеся списки.Если имя файла! = Ноль, то я обработаю цену для файла и выбора.

Так, если бы файл 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());

            ....


        }

Ответы [ 3 ]

1 голос
/ 06 декабря 2011

Есть несколько способов сделать это.Вы можете создать класс 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 ...   
1 голос
/ 06 декабря 2011

Вы должны заполнять ваш ComboBox динамически, как и вы.Вместо SelectedIndex вы можете использовать SelectedValue, который не зависит от количества элементов.

См. Например: Использование ValueMember в ComboBox

1 голос
/ 06 декабря 2011

Вы не должны использовать один трехмерный массив. Вам понадобятся 3 таблицы для этого. Храните все ваши типы в базе данных.
3 таблицы:
1. бумага
2. СМИ
3. papermedia

так. Вы заполняете первый выпадающий список с размерами бумаги. затем, когда элемент выбран в форматах бумаги, вы запускаете запрос для заполнения выпадающего мультимедиа (вы объединяетесь через таблицу пересечений). таким образом, вы будете показывать только те материалы, которые доступны только для этого формата. или вы можете сделать наоборот. Это отвечает на ваш вопрос?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...