C # CheckedListBox, как манипулировать проверенными данными? - PullRequest
0 голосов
/ 12 июня 2018

Привет, ребята, новички в C #, и я пытаюсь настроить графический интерфейс, все, что я хочу, чтобы графический интерфейс, это иметь простой файловый менеджер с CheckedListBox для представления выбранных файлов.Я могу заставить CheckedListBox появляться и щелкать по файлам, но я не уверен, как продолжить, большинство учебников на этом останавливается или слишком углубляется в древовидном представлении и других вещах, которые кажутся ненужными для того, что я пытаюсь сделать.Вот мой код:

Любая помощь приветствуется, и если вы, ребята, могли бы указать мне правильное направление, это было бы здорово.

РЕДАКТИРОВАТЬ:
Перефразировать мой вопрос:

Я хочу, чтобы пользователь выбирал файлы с помощью CheckedListBox (пользовательский ввод останавливается здесь), и эти выбранные файлы должны быть помещены в список, которым мой код может манипулировать.
Не уверен, как это сделать после моего первого foreachцикл (который добавляет все файлы в выбранном каталоге в CheckedListBox для выбора пользователя).

Второй цикл foreach - это попытка сделать это, манипулируя файлами так, чтобы они выводили свои имена файлов после выбора.Однако окно сообщений не отображается, и я предполагаю, что это разъединение между пользователем, выбирающим файлы, и кодами, пытающимися манипулировать этими файлами.

Второе редактирование:
Мне кажется, я понял, что сделал вторую кнопкуи отсюда похоже, что я могу манипулировать выбранными файлами так, как я хочу.
В настоящее время код работает так, как я ожидаю.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;

namespace SelectFiles
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            checkedListBox1.CheckOnClick = true;
        }

    private void button1_Click(object sender, EventArgs e)
    {
        FolderBrowserDialog fbd = new FolderBrowserDialog();
        if (fbd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
        {
            MessageBox.Show(fbd.SelectedPath);
            checkedListBox1.Items.Clear();
            string[] files = Directory.GetFiles(fbd.SelectedPath);

            foreach (string file in files)
            {
                checkedListBox1.Items.Add(file);
            }
        }
    private void button2_Click_1(object sender, EventArgs e)
    {
        List<string> list_all_excelfiles = new List<string>();
        foreach (string item in checkedListBox1.CheckedItems)
        {
            list_all_excelfiles.Add(item);
            MessageBox.Show(Path.GetFileName(item));
        }
    }
}

}

1 Ответ

0 голосов
/ 13 июня 2018

Сначала я советую вам назначить Value member и Display member для каждого элемента.

  • Показать член будет виден пользователю
  • Значение Member мы будем использовать в коде

Для этого сначала создайте простой пользовательский класс

public class Int_String
{
    public int _int { get; set; }
    public string _string { get; set; }
}

Be careful because get; set; part is important to be there since if not code will not work

Теперь вам нужно создать список элементов с пользовательским классом, подобным этому

class YourForm : Form
{
    List<Int_String> myList = new List<Int_String>(); //Create list of our custom class

    public YourForm()
    {
        PopulateMyList();
    }

    private void PopulateMyList()
    {
        //Here read from database or get data somehow and populate our list like this
        //I will populate it manually but you do it in foreach loop

        myList.Add(new Int_String { _int = 0, _string = "First Item" });
        myList.Add(new Int_String { _int = 1, _string = "Second Item" });
        myList.Add(new Int_String { _int = 2, _string = "Third Item" });
    }
}

После этого вам нужно назначить этот список вашему checkedListBox, что вы будете делать следующим образом:

public YourForm()
{
    PopulateMyList();
    checkedListBox1.DataSource = myList;
    checkedListBox1.DisplayMember = "_string";
    checkedListBox1.ValueMember = "_int";
}

А теперь, когда вы можете манипулировать с отмеченными элементами, как это:

for(int i = 0; i < checkedListBox1.Items.Count; i++)
{
    if(checkedListBox1.Items[i].CheckedState == CheckState.Checked)
    {
        int itemValueMember = (checkedListBox1.Items[i] as Int_String)._int; 
        int itemDisplayMember = (checkedListBox1.Items[i] as Int_String)._string;

        //Use these two vars for whatever you need
    }
}

ДВА ВАЖНЫХ СОВЕТА:

  • Я не уверен в этом, так как пишу все это из головы, но я думаю, что Visual Studio не покажет вам, что естьDisplayMember или ValueMember для checkedBox компонента, НО также не будет отображать ошибку.Причина в том, что они намеренно скрыли для idk, какая причина, но она будет работать.
  • Вы можете назначить элемент Display и Value множеству компонентов в winforms, НО по какой-то причине checkedListBoxКонкретно.Это связано с тем, что вы ДОЛЖНЫ сначала присвоить ему DataSource, а затем сообщить checkedListBox.DisplayMember = "_string" ......Для нового парня вы спросите, почему это важно.Простой ответ - создать собственный список для тестирования и добавить в него 10 тыс. Элементов, а затем сначала объявить datasource, а затем Display и Value member.Проверьте, как долго нужно загружать форму (выйти из состояния замораживания).После этого сделайте все то же самое, но сначала объявите Display и Value member, а затем присвойте datasource и протестируйте снова.Я говорю об этом с головы без тестирования, но до того, как мне понадобилось около 5 тыс. Строк с первым решением, мне потребовалось около 30 секунд, а второй <1 секунда.Если вы хотите узнать об этом больше, воспользуйтесь Google, но сейчас это довольно большая информация для вас. </li>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...