嘿,刚接触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));
}
}
}
}
答案 0 :(得分:0)
首先,我建议您为每个项目分配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
}
}
两个重要提示:
DisplayMember
或ValueMember
checkedBox
组件它也不会显示错误。原因是他们故意隐藏了idk是什么原因,但它会起作用。Display
和Value
成员分配给winforms中的许多组件但由于某种原因checkedListBox
是特定的。DataSource
。具体是因为您必须首先为其分配checkedListBox.DisplayMember = "_string" .....
然后告诉它datasource
。对于新人,你会问为什么它很重要。简单的答案是为测试创建自定义列表并在其中添加10k项,然后首先声明Display
及其后Value
和Display
成员。测试表格需要加载多长时间(退出冻结状态)。在此之后执行所有操作,但首先声明Value
和datasource
成员,然后再分配String x = "test";
x = null;
并再次测试。我是在没有测试的情况下从头部告诉我的,但在我需要大约5k行的第一个解决方案之前,它花了我大约30秒和第二个&lt; 1秒。如果你想了解更多关于谷歌它的信息,但现在这几乎是你的信息。