簡體   English   中英

C#CheckedListBox如何處理檢查的數據?

[英]C# CheckedListBox how to manipulate checked data?

嘿,剛接觸C#的家伙們,我正在嘗試設置GUI,我想要GUI要做的就是擁有一個帶有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));
        }
    }
}

}

首先,我建議您為每個項目分配Value memberDisplay member

  • 顯示成員將對用戶可見
  • 我們將在代碼中使用Value 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不會向您顯示checkedBox組件有DisplayMemberValueMember ,但它也不會顯示錯誤。 原因是他們為idk故意隱藏了什么原因,但是它將起作用。
  • 由於checkedListBox是特定的原因,您可以將DisplayValue成員分配給winforms BUT中的許多組件。 這是特定的,因為您必須首先將DataSource分配給它,然后告訴它checkedListBox.DisplayMember = "_string" ..... 對於新手,您會問為什么這很重要。 簡單的答案是為測試創建自定義列表,並在其中添加10k項,然后首先聲明datasource ,然后再聲明DisplayValue成員。 測試表單需要加載多長時間(退出凍結狀態)。 之后,執行所有相同的操作,但首先聲明DisplayValue成員,然后分配datasource並再次進行測試。 我從頭開始就告訴了這一點,而沒有進行測試,但是在需要第一種解決方案的情況下,當我需要約5k行之前,我花了大約30秒鍾,第二秒鍾<1秒鍾。 如果您想了解更多有關google的信息,但是現在這對您來說是很多信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM