即使在C#中关闭表单后仍保留ListBox项

时间:2015-06-25 08:54:42

标签: c# winforms listbox

我有一个列表框,我可以通过单击按钮从文本框中添加项目。我想要的是,即使我每次打开表单时关闭表单,都应显示列表框中较早出现或保存的列表。

表单关闭时,我无法在列表框中显示列表。列表框是另一种形式,第一个表单中的按钮单击打开第二个表单。请帮助我如何在列表框中显示项目或者即使在表单关闭后也保留保存的值。代码如下: -

第二表格代码: -

          private void bn_CreateProfile_Click(object sender, EventArgs e)
    {
        txt_ProfileName.Enabled = true;

        bn_CreateProfile.Text = "Add Profile";

        if (txt_ProfileName.Text == "")
        {
            lb_ProfileList.Items.Clear();
        }
        else
        {
            lb_ProfileList.Items.Add(txt_ProfileName.Text);
        }

    }



    private void lb_ProfileList_SelectedIndexChanged_1(object sender, EventArgs e)
    {
        String[] items = lb_AllProjects.CheckedItems.Cast<String>().ToArray<String>();
        foreach (var item in items)
        {
            for (int d = 0; d < lb_AllProjects.SelectedItems.Count; d++)
            {
                lb_SelectedProjects.Items.Add(item);
                lb_AllProjects.Items.Remove(item);
            }
        }
    }

    private void bn_SaveProfile_Click(object sender, EventArgs e)
    {
        const string spath = "ProfileList.txt";
        System.IO.StreamWriter SaveFile = new System.IO.StreamWriter(spath,true);



        foreach (var profileitem in lb_ProfileList.Items)
        {
            SaveFile.Write(profileitem + " ");

            foreach(var selecteditems in lb_SelectedProjects.Items)
            {
                SaveFile.Write("#" + " " + selecteditems);       
            }
            SaveFile.WriteLine("\n");


        }

        SaveFile.Close();

        MessageBox.Show("Profile Saved");

    }      

第1表格代码: -

  private void bn_ManageProfile_Click(object sender, EventArgs e)
    {
        ProfileManager ProfileManager = new ProfileManager(cmb_drive.GetItemText(cmb_drive.SelectedItem) + @"FilePath");
        ProfileManager.ShowDialog();



    }

3 个答案:

答案 0 :(得分:0)

如果要永久存储这些项目,则应使用数据库。 或者你可以做的只是保留一个列表来保存你添加的所有项目,并在打开表单时将这些项目添加到列表框中。

当表格关闭时,将列表框中的所有项目添加到新创建的集合中,例如MyList。

打开表单时,将MyList中的每个项目添加到列表框项目中。

答案 1 :(得分:0)

您可以使用Properties在表单之间传递列表值。

我还没有编译下面的代码,所以要小心,但它应该指向正确的方向。

假设Form1是父母:

在Form1中,创建一个静态对象来保存值

private static List<string> MyListItems = new List<string>();

Form2中,设置一些可由Form1

访问的属性
private List<string> theListItems;
public List<string> TheListItems
{
    get { return theListItems; }
    set { theListItems = value; }
}

您的Form2方法应更改为使用您刚刚创建的Field

private void lb_ProfileList_SelectedIndexChanged_1(object sender, EventArgs e)
{
    foreach (string item in theListItems)
    {
        for (int d = 0; d < lb_AllProjects.SelectedItems.Count; d++)
        {
            lb_SelectedProjects.Items.Add(item);
            lb_AllProjects.Items.Remove(item);
        }
    }
}

Form2中更改ListBox中的值时,请务必更新theListBoxItems列表。也许你可以在Form_Closing的{​​{1}}事件中做点什么。

Form2

theListBoxItems.Add("My Value"); 中,通过将列表项目传递给Form1来调用Form2

private void bn_ManageProfile_Click(object sender, EventArgs e)
{
    // Create instance of ProfileManager form
    using (ProfileManager MyProfileManager = new ProfileManager(cmb_drive.GetItemText(cmb_drive.SelectedItem) + @"FilePath"))
    {
        // Pass list to form
        MyProfileManager.TheListItems = MyListItems;
        // Show form
        MyProfileManager.ShowDialog();

        // Get value back from form
        MyListItems = MyProfileManager.TheListItems;
    }
}

现在,列表会自动在表单之间传递。

我希望这是有道理的。

答案 2 :(得分:0)

Form 1:- 
             private void bn_ManageProfile_Click(object sender, EventArgs e)
            {
        ProfileManager ProfileManager = new ProfileManager(cmb_drive.GetItemText(cmb_drive.SelectedItem) +@"FolderPath");

           ProfileManager.ShowDialog();
          }

表格2: -

    public ProfileManager(String Path)
    {
        InitializeComponent();
        PopulateListBox(@"C:\Users\ProfileList.txt");

        string[] testedfiles = System.IO.Directory.GetFiles(Path,"*.vcxproj");       // Display the list of .vcxproj projects to Build
        foreach (string file in testedfiles)

            lb_AllProjects.Items.Add(System.IO.Path.GetFileName(file));

    }

     private void PopulateListBox(string path)
     {

        string[] lines = System.IO.File.ReadAllLines(path);

        foreach (string line in lines)
        {
            this.lb_ProfileList.Items.Add(line.Split(' ')[0]);


        } 
     }

我已经创建了一个函数来帮助我加载Listbox值,即使在窗体关闭后它只是解决了我的问题。