Checklist с доп значениями

81
08 мая 2021, 16:40

Можно ли как то реализовать checklist, что бы отображался один текст, и к нему привязана другая строка? Опишу по подробнее, начал осваивать С#. Есть задача дать пользователю список баз данных, он отмечает строки и по кнопке идет обработка отмеченных значений. Но человек работает с наименованием, а обрабатывать нужно по ИД. Пока реализовал с помощью списка на форме с наименованиями, и массивом ИД с одинаковыми индексами. Но как мне кажется, это не совсем корректно использовать, да и накладывает ограничения. В общем идеально было бы, что бы у элемента списка было представление и значение.

Answer 1

Создайте модель данных:

public class Item
{
    public string Title { get; set; }
    public string Value { get; set; }
    public bool IsChecked { get; set; }
}

Title - это то, что будет позазываться пользователю (представление).
Value - значение. Тип выберите нужный вам.
IsChecked - выбран элемент или нет.

В приложении делаем привязку данных.
Контрол CheckedListBox зачем-то прячет некоторые унаследованные свойства. Получаем к ним доступ путём приведения к ListBox.

В событии ItemCheck отмечаем выбранные элемент.
При клике по свободному месту формы можно посмотреть значения выбранных элементов.

using System;
using System.Windows.Forms;
using System.Collections.Generic;
using System.Linq;
namespace WinFormApp1
{
    public partial class Form1 : Form
    {
        CheckedListBox checkedListBox;
        List<Item> items;
        public Form1()
        {
            items = new List<Item>
            {
                new Item { Title="TitleA", Value="ValueA" },
                new Item { Title="TitleB", Value="ValueB" },
                new Item { Title="TitleC", Value="ValueC" },
            };
            checkedListBox = new CheckedListBox { Parent = this, Dock = DockStyle.Left };
            var listBox = (ListBox)checkedListBox;
            listBox.DataSource = items;
            listBox.DisplayMember = nameof(Item.Title);
            listBox.ValueMember = nameof(Item.Value);
            checkedListBox.ItemCheck += CheckedListBox_ItemCheck;
            this.Click += Form1_Click;
        }
        private void Form1_Click(object sender, EventArgs e)
        {
            var checkedValues = items.Where(x => x.IsChecked).Select(x => x.Value);
            this.Text = string.Join(", ", checkedValues);
        }
        private void CheckedListBox_ItemCheck(object sender, ItemCheckEventArgs e)
        {
            items[e.Index].IsChecked = e.NewValue == CheckState.Checked;
        }
    }
}
READ ALSO
Как применить один HTML тело 2 и более .php файлу?

Как применить один HTML тело 2 и более .php файлу?

Я делал блог (тестовое задание) используя MVC архитектуру и HTML тело прописал на View (show_mainphp здесь и Bootstrap, CSS, JS файлы подключены)

82
работа с Git в другой папке

работа с Git в другой папке

Подскажите, пожалуйстая нахожусь в папке /test

102
openssl_pkey_get_private и переносы строк

openssl_pkey_get_private и переносы строк

Есть private key в виде строки с переносом строк \n :

94