Ramtin992 Ответов: 1

Как привязать checkedlistbox к combobox и текстовому полю одновременно в C#?


У меня есть база данных в ms access. Я подключил его к C#.
Пользователю необходимо выбрать тип крана с помощью выпадающего списка. В тот момент, когда пользователь выбирает элемент в combobox, я хочу иметь некоторые элементы, связанные с этим выбором, в checkedlistbox, что я и сделал в этой части. Следующий шаг, который я не знаю, как сделать, заключается в том, что для уточнения элементов в checkedlistbox есть 2 текстовых поля для минимальной и максимальной мощности крана. Когда пользователь вводит минимальное число, я хочу, чтобы checkedlistbox обновлялся и снова, когда пользователь вводит максимальную емкость во втором текстовом поле, последний фильтр применял окончательные элементы, заполненные в checkedlistbox.

Это моя таблица в базе данных

| Crane Index | Crane Model Number |  Crane Type | Crane Capacity Rating (tons) |
|:-----------:|:------------------:|:-----------:|:----------------------------:|
| 221         | LR 1400-1          | Crawler     | 440                          |
| 258         | CC 2800            | Crawler     | 660                          |
| 262         | CC 2400-1          | All Terrain | 400                          |
| 265         | CC 6800            | Crawler     | 1375                         |
| 277         | LR 11350           | All Terrain | 1250                         |


Что я уже пробовал:

<pre>List<string> crane_type = new List<string>();
            for (int i = 0; i< test.Tables["cranemaintable"].Rows.Count; i++)
            {
                if (!crane_type.Contains(test.Tables["cranemaintable"].Rows[i]["crane type"]))
                {
                    crane_type.Add(Convert.ToString(test.Tables["cranemaintable"].Rows[i]["crane type"]));
                }                
            }        
            //bind the crane_type list to the combobox1
            comboBox1.DataSource = crane_type;


private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
       {
           //clear the checkedboxlist everytime that the combobox itme is changed
           checkedListBoxCrane.Items.Clear();
           //loop through the "cranemaintable" table and if the item that selected in the combobox is
           //equal to the "crane type" column then populate that item into the checkedlistbox
           foreach(DataRow item in test.Tables["cranemaintable"].Rows)
           {
               if (Convert.ToString(item["crane type"]) == Convert.ToString(comboBox1.SelectedItem))
               {
                   checkedListBoxCrane.Items.Add(Convert.ToString(item["crane model number"]));
               }

           }

       }

Gerry Schmitz

В этом случае вам лучше установить флажки, когда вы "сохраняете" или пытаетесь сохранить. Потому что вам также нужно "снять галочку", если пользователь начинает возвращать свой первоначальный выбор.Звучит как какой-то "завершенный контрольный список", поэтому проверка "в конце" не является чем-то необычным.

Ramtin992

Не могли бы вы объяснить немного подробнее? Я довольно новичок в c#
Спасибо.

1 Ответов

Рейтинг:
12

BillWoodruff

Я не собираюсь писать наш код для вас, но надеюсь, что смогу дать вам несколько идей:

1, чтобы заполнить ComboBox с набором ном повторяющиеся элементы:

// dt is the DataTable
// c2 is the #2 DataColumn

var cval = dt.AsEnumerable().Select(row => row[c2]).Distinct().Select(rw => rw.ToString()).ToList();

comboBox1.DataSource = cval;
2 заполнение CheckdListBox при изменении выбора ComboBox:
private void comboBox1_SelectedValueChanged(object sender, EventArgs e)
{
    checkedListBox1.Items.Clear();

    string csel = comboBox1.SelectedValue.ToString();

    foreach(DataRow row in dt.Rows)
    {
        if (row[2] == csel)
        {
            checkedListBox1.Items.Add($"{row[1]}\t\tMax Tons: {row[3]}");
        }
    }
}
Здесь я сделал выбор добавить максимальное количество тонн к строке, отображаемой в поле CheckedListBox.

3 На этом этапе мы подходим к вашей цели отфильтровать CheckedListBoxItems по минимальным и максимальным значениям емкости. Я предлагаю вам использовать элементы управления NumericUpDown для пользовательского ввода.

Очень жаль, что CheckedListBoxItems не имеют свойства тега, в которое можно было бы вставить максимальную емкость. Я предлагаю вам создать справочный словарь для сопоставления ComboBoxItems с комбинацией (возможно, кортежем ?) CraneModel и max capacity: затем, когда пользователь изменяет capacity, min или max, вы можете повторить этот словарь, чтобы перестроить/обновить CheckedListBoxItems,

// эскиз словарь&ЛТ;comboboxitem, список<(?,="" ?.мощность)=""&ГТ;

Действительно ли конечному пользователю нужно вводить как минимум, так и максимум ?


Ramtin992

Спасибо за ваш ответ.
Нет, пользователю не нужно ставить там цифру, он может уточнить результаты, если захочет.

Я получил ошибку для этого раздела:
строка csel = comboBox1.SelectedValue.Метод toString();
он говорит: ссылка на объект не установлена на экземпляр объекта
Как я могу это исправить? Я знаю причину, но как я могу ее исправить?
У меня есть comboBox1.SelectedItem = null; так как я хочу, чтобы combobox был нулевым в начале программы.

BillWoodruff

Теперь хорошая часть :) где вы учитесь отлаживать. Начните с размещения точек останова в выпадающем списке: если вы никогда не попадали в точку останова, значит, вы не подключили обработчик событий SelectedValueChanged для выпадающего списка.

если ComboBox выдает ошибку на строке csel = comboBox1.SelectedValue.Метод toString();

Затем используйте точку останова перед этой строкой и проверьте, действительно ли вы добавили значения в поле со списком.

Примеры кода, которые я показал вам, все зависят от того, что DataTable полностью настроен. Первый пример требует наличия экземпляра столбца данных в переменной 'c3.

Ramtin992

Еще раз спасибо за вашу помощь. Я могу это исправить.
Должен сказать, что мне очень понравилась ваша идея.
Кроме того эта часть великолепна :
checkedListBox1.Предметы.Добавить($"{строка[1]}\т\т тмакс: {строка[3]}");
Здесь есть странная проблема, она работает, но странным образом
Есть 13 элементов, которые заполняются в поле checkelistbox, и все они выровнены друг с другом, за исключением двух из них, похоже, что эти элементы не принимают "\t\t" в коде и атташе к {строке[1]}.
Если это случилось для всех них, я думал, что сделал что-то не так, но это только для 2 пунктов, которые случались всегда. Эти два пункта не согласуются с остальными пунктами.

BillWoodruff

гипотеза: символ /t-это символ табуляции ... вероятно, линия была отрезана, потому что она была слишком длинной, чтобы соответствовать границам элемента управления CheckedListBox ... попробуйте заменить вкладки несколькими пробелами и посмотреть ...

Ramtin992

Я сделал это:
checkedListBox1.Предметы.Add($"{row[1]}>>\tMax Tons: {row[3]}");
Он работает отлично.
Спасибо.

BillWoodruff

к вашему сведению: вы можете использовать ListView, который будет показывать флажки и имеет несколько столбцов.

пожалуйста, голосуйте за решения: обратная связь, pro или con, помогает сообществу CP.

Ramtin992

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

BillWoodruff

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

Да, есть много способов реализовать пользовательский интерфейс для представления этого типа данных и предоставления пользователю приложения методов для управления представлениями.

Я думаю, что всегда полезно продолжать задавать вопрос: "что пользователь должен делать и хочет делать?"

Иногда программисты опьяняются опциями, новейшими функциями, элементами управления и т. д. :)

TheRealSteveJudge

5* за хорошее решение и обнадеживающие, а также полезные комментарии

BillWoodruff

Спасибо, Стив, ваш комментарий очень ценен !