如何跨winforms访问List集合

时间:2013-08-27 19:04:10

标签: c# winforms

我有一个这个自定义类的列表。

public class Item
{
    public string @Url;
    public string Name;
    public double Price;

    public Item(string @url, string name, double price)
    {
        this.Url = url;
        this.Name = name;
        this.Price = price;
    }


    public void setPrice(Button button)
    {
        this.Price = Convert.ToDouble(button.Text);
    }
}

现在在我的主要winform中宣布

List<Item> items = new List<Item>();

字段通过添加按钮设置,如下所示,它们从3个文本框中获取信息并将其存储在新项目中。

Regex url = new Regex(@"^[a-zA-Z0-9\-\.]+\.(com|org|net|ca|mil|edu|COM|ORG|NET|CA|MIL|EDU)$");
Regex name = new Regex(@"^[0-9, a-z, A-Z, \-]+$");
Regex price = new Regex(@"^[0-9, \.]+$");

if (url.IsMatch(urlText.Text) && name.IsMatch(nameText.Text) && price.IsMatch(priceText.Text))
{
     itemListBox.Items.Add(nameText.Text);
     double item_Price = Convert.ToDouble(priceText.Text);
     items.Add(new Item(@itemURL.Text, itemName.Text, item_Price));
     nameText.Clear();
     priceText.Clear();
     urlText.Clear();
}
else
{
     match(url, urlText, urlLabel);
     match(price, priceText, priceLabel);
     match(name, nameText, nameLabel);
}

正如您在上面的代码中所看到的,它还将项目的名称添加到项目列表框中。现在我有另一个窗口表单,当单击编辑按钮时弹出窗口。如何使编辑表单中的项目列表框与主窗体窗体中的项目列表框完全相同?

在基本问题中,我如何将项目列表传输到编辑表单。我已经尝试通过构造函数传递它,因为我希望编辑的信息保持不变,无论winform是什么。构造函数在编辑表单中声明:

public Edit(List<Item> i)
{
    itemList = i;
    InitializeComponent();
}

当我加载列表框

foreach (Item i in itemList)
{
   itemListBox.Items.Add(i.Name);
}

列表框显示Name而不是name

的实际值

更新1:No work

更新2:

我的主要winform代码http://pastebin.com/mENGKdnJ

编辑winform代码http://pastebin.com/tvp95jQW

不要注意打开文件对话框我不知道如何编码它到目前为止编写这个程序已经教会了我很多,因为我学习了我去。

1 个答案:

答案 0 :(得分:2)

您不需要将列表作为ref发送,只有在更改(指针)实例本身时才需要ref。添加/删除项目不会影响列表实例。

更新:

列表框使用ToString()来显示项目的一些描述。

public class Item
{
    public string @Url;
    public string Name;
    public double Price;

    public Item(string @url, string name, double price)
    {
        this.Url = url;
        this.Name = name;
        this.Price = price;
    }


    public void setPrice(Button button)
    {
        this.Price = Convert.ToDouble(button.Text);
    }

    public override string ToString()
    {
        // example: return string.Format("{0} -> {1}", this.Name, this.Price);
        return this.Price;
    }

}

所以你不应该添加名称,而是添加对象

foreach (Item i in itemList)
{
   itemListBox.Items.Add(i);
}

成瘾(小提示)

public class Item
{
    public string @Url {get; set;}
    public string Name {get; set;}
    public double Price {get; set;}

    public Item(string @url, string name, double price)
    {
        this.Url = url;
        this.Name = name;
        this.Price = price;
    }
}

SetPrice(转换为double不应放在此处)

更新 _ __ _ __ _ __ _ __ _ __ _ __

我想我明白了:

if (url.IsMatch(urlText.Text) && name.IsMatch(nameText.Text) && price.IsMatch(priceText.Text))
{
     itemListBox.Items.Add(nameText.Text);
     double item_Price = Convert.ToDouble(priceText.Text);
     items.Add(new Item(@itemURL.Text, itemName.Text, item_Price));
     nameText.Clear();
     priceText.Clear();
     urlText.Clear();
}

您将 nameText .Text添加到列表框中,但是将 itemName .Text传递给项目构造函数。

与正则表达式匹配器中的 urlText .Text相同,但 itemURL .Text会传递给构造函数。