C#表单在启动时加载ComboBox项目

时间:2015-06-07 13:21:12

标签: c# combobox

public Form1()
{
    InitializeComponent();
    loadComboEmail();
}

private void loadComboEmail()
{
    string path = Directory.GetCurrentDirectory();
    string build = (path + "\\" + "email.txt");
    string[] lines = System.IO.File.ReadAllLines(build);

    comboEmail.Items.AddRange(lines);
    comboEmail.SelectedIndex=0;
}

我有一个组合框,我想加载存储在文本文件中的客户端电子邮件地址。使用我从文本文件中读取的loadComboEmail()并加载Combobox。我是否通过在表单启动时调用loadComboEmail来做一些被认为是不好的做法?如果是这样,我如何正确读取文本文件,然后将其加载到组合中,所以当表单加载时,它有必要的数据?

3 个答案:

答案 0 :(得分:2)

不,这看起来很合法。你不必担心,因为这是WinForms中加载所有内容的方式...这将在短时间内阻止UI线程,但是因为你不会加载巨大的大量的东西,你甚至都不会注意到它。

当您开始执行更多操作和大文件时,您应该考虑使用BackgroundWorkerTask

无论如何,您还应该考虑使用以下内容代替您的代码:

private void loadComboEmail()
{
    string path = System.IO.Path.GetDirectoryName(Application.ExecutablePath); //seems to be the same to me, but is safer
    string build = System.IO.Path.Combine(path, "email.txt"); //much more safer then simple string addition
    string[] lines = System.IO.File.ReadAllLines(build);

    comboEmail.Items.AddRange(lines);
    comboEmail.SelectedIndex = 0;
}

答案 1 :(得分:0)

您可以使用:

 Task task = Task.Factory.StartNew(() =>
 {
    // Background work
    loadComboEmail();
 }).ContinueWith((t) => 
 {
    //If you need to execute something after the loading process.
 });

为了更新UI线程,您可以在另一个线程上进行阅读,并在加载电子邮件列表时,只需更新它。

Task.Factory.StartNew(() =>
        {
            // Background work - read the file
        }).ContinueWith((t) => {
            // Update UI thread here

        }, TaskScheduler.FromCurrentSynchronizationContext());

答案 2 :(得分:0)

使用构造函数加载不被视为不良做法。阅读Hans Passant的答案,了解何时应该使用窗口的加载事件。 What setup code should go in Form Constructors versus Form Load event?

Altough正如评论中所说,你正在阻止UI线程。在构造函数中,不能使用关键字await。所以你必须“开火,忘记”。使用Load事件时,您可以使用await,但事件处理程序为async void。因此,他们没有等待,你已经过火了,忘记了。

public Form1()
{
    InitializeComponent();
    loadComboEmail();
}

private async Task loadComboEmail()
{
    string path = Directory.GetCurrentDirectory();
    string build = (path + "\\" + "email.txt");
    string[] lines = await Task.Run(() => File.ReadAllLines(build));

    comboEmail.Items.AddRange(lines);
    comboEmail.SelectedIndex=0;
}