[英]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 member
和Display 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
}
}
兩個重要提示:
checkedBox
組件有DisplayMember
或ValueMember
,但它也不會顯示錯誤。 原因是他們為idk故意隱藏了什么原因,但是它將起作用。 checkedListBox
是特定的原因,您可以將Display
和Value
成員分配給winforms BUT中的許多組件。 這是特定的,因為您必須首先將DataSource
分配給它,然后告訴它checkedListBox.DisplayMember = "_string" .....
對於新手,您會問為什么這很重要。 簡單的答案是為測試創建自定義列表,並在其中添加10k項,然后首先聲明datasource
,然后再聲明Display
和Value
成員。 測試表單需要加載多長時間(退出凍結狀態)。 之后,執行所有相同的操作,但首先聲明Display
和Value
成員,然后分配datasource
並再次進行測試。 我從頭開始就告訴了這一點,而沒有進行測試,但是在需要第一種解決方案的情況下,當我需要約5k行之前,我花了大約30秒鍾,第二秒鍾<1秒鍾。 如果您想了解更多有關google的信息,但是現在這對您來說是很多信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.