1

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

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);
}

列表框显示名称而不是名称的实际值

更新 1:没有工作

更新 2:

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

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

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

4

1 回答 1

2

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

更新:

列表框使用 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 (不应将转换为双精度)

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

我想我看到了:

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 被传递给构造函数。

于 2013-08-27T19:10:26.763 回答