2

ここで明らかな何かが欠けているように感じます。これは私のフォームのスクリーンショットです。

ShoppingBasket と OrderItem の 2 つのクラスと、Form1 クラスがあります。OrderItem には、ShoppingBasket で使用したい 4 つのプロパティがあります。textbox1 に製品名、numericupdown1 に数量、textbox2 に最新の価格を取得したい場合は、追加ボタンをクリックして OrderItem クラスを使用して値を検証し、ShoppingBasket クラスの AddProduct メソッドに値を入力します。うまくいけば、フォームのリストボックスに行が追加されます。

フォーム1:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void addButton_Click(object sender, EventArgs e)
    {
        decimal latestPrice;

        ShoppingBasket addButtonShoppingBasket = new ShoppingBasket();

        decimal.TryParse(textBox2.Text, out latestPrice);
        OrderItem currentItemQuantity1 = new OrderItem(textBox1.Text, latestPrice, Convert.ToInt32(numericUpDown1.Value));

        addButtonShoppingBasket.AddProduct(currentItemQuantity1.ProductName, currentItemQuantity1.LatestPrice, currentItemQuantity1.Quantity);
    }
}

買い物かご:

public class ShoppingBasket
{
    public ShoppingBasket()
    {

    }

    public void AddProduct(string productName, decimal latestProductValue, int quantity)
    {
        Form1 newform = new Form1();

        string itemFormatString = "{0,-50}{1,0}{2,50}";
        newform.listBox1.Items.Add(string.Format(itemFormatString, productName, Convert.ToString(quantity), Convert.ToString(latestProductValue)));
    }
}

オーダーアイテム:

public class OrderItem
{
    public OrderItem(string productName, decimal latestPrice, int quantity)
    {
        ProductName = productName;
        LatestPrice = latestPrice;
        Quantity = quantity;
        TotalOrder = latestPrice * quantity;
    }

    public string ProductName { get; set; }

    public decimal LatestPrice { get; set; }

    public int Quantity { get; set; }

    public decimal TotalOrder { get; set; }
}
4

1 に答える 1

1

あなたの問題は、ShoppingBasked製品が追加されるたびに、から新しいフォームを作成していることです:

public void AddProduct(string productName, decimal latestProductValue, int quantity)
{
    Form1 newform = new Form1();

    string itemFormatString = "{0,-50}{1,0}{2,50}";
    newform.listBox1.Items.Add(string.Format(itemFormatString, productName, Convert.ToString(quantity), Convert.ToString(latestProductValue)));
}

newformは、実際にAddProduct!を呼び出した形式ではありません。これがnewformどこにも表示されなくても (newform.Show()が呼び出されていないため)、リスト項目は元のフォームではなく、この「見えない」フォームに追加されます。

この問題を解決するには、フォームをパラメーターとして次のように渡すことをお勧めしますAddProduct

public void AddProduct(Form1 form, string productName, decimal latestProductValue, int quantity)
{
    string itemFormatString = "{0,-50}{1,0}{2,50}";
    form.listBox1.Items.Add(string.Format(itemFormatString, productName, Convert.ToString(quantity), Convert.ToString(latestProductValue)));
}

そして、次のように呼び出します。

private void addButton_Click(object sender, EventArgs e)
{
    // ...
    // Your current code here
    // ...

    addButtonShoppingBasket.AddProduct(this, 
        currentItemQuantity1.ProductName, 
        currentItemQuantity1.LatestPrice, 
        currentItemQuantity1.Quantity);
}

また、継続するための一般的なアドバイスは、デザインを変更することです。現在、ShoppingBasketは と強く結合しています。つまり、 !Form1以外のソースからショッピング バスケットに新しいアイテムを追加することはできません。Form1ただしShoppingBasket、受け取るアイテムのソースを気にする必要はありません。ShoppingBasketまた、アイテムを挿入するたびに、新しい を作成する瞬間にも。つまり、 ごとに 1 つのアイテムしか持つことができませんShoppingBasket。したがって、さらに学習するために、次の点に従うことをお勧めします。

  • ShoppingBasketのメンバー変数を作成しForm1ます。
  • アイテムを追加するときは、このメンバー変数にアイテムを追加します。
  • フォームを に渡すのAddProductではなく、フォームにShoppingBasket含まれるアイテムに関する情報を提供してください。
  • listBox1.Items.Addの直後に呼び出しますAddProduct

次に、ShoppingBasket製品がどのように表示されるかは気にせず、製品が内部でどのように保管されるかだけを気にします.

于 2013-07-19T07:53:05.713 に答える