在方法和表单之间传递数据 (List<t>)

Pass datas between methods and forms (List<t>)

我有两种形式,一种是 console,你可以在其中添加客户和产品,另一种是 shop 在这里您可以检查列表中有哪些客户、哪些产品,您还可以通过列表框将它们绑定到一个唯一的对象(购物车)中。我的问题是目前表单无法共享数据,所以我想知道如何。

我知道我可以使用数据库,但这只是练习,所以我想知道。

控制台有一个返回商店的按钮:

        private void tornaAlloShopButton_Click(object sender, EventArgs e)
    {
        Shop Login = new Shop();
        Login.Show();
        this.Hide();
    }

代码会很长,因为这些列表存储在我的接口实现中的列表中,这是其中包含列表的部分:

    public class DBMemoryManager : DBManager
{

    //Arrays

    List<ClienteModel> MemoryClienti = new List<ClienteModel>();
    List<ProdottoModel> MemoryProdotti = new List<ProdottoModel>();
    List<CarrelloModel> MemoryCarrello = new List<CarrelloModel>();

这是 控制台的初始部分 form.cs:

 public partial class ConsoleAnagrafica : Form
{
    //Istanziazione [0]

    DBMemoryManager dbMemoryManager = null;

    public ConsoleAnagrafica()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        //Istanziazione [1]

        dbMemoryManager = new DBMemoryManager();
    }

这是 商店 起始代码:

public partial class Shop : Form
{
    //Istanziazione [0]

    DBMemoryManager dbMemoryManager = null;

    public Shop()
    {
        InitializeComponent();
    }

    private void Shop_Load(object sender, EventArgs e)
    {
        //Istanziazione [1]

        dbMemoryManager = new DBMemoryManager();
    }

这样我就可以回忆起我interface中的所有方法:

public interface DBManager
{
    //Carrello

    void CreateCarrello (CarrelloModel model);
    List<CarrelloModel> ReadAllCarrello (CarrelloModel model);

    //Cliente
    
    bool CreateCliente(ClienteModel model);
    void UpdateCliente(ClienteModel model);
    void DeleteCliente(ClienteModel model);
    List<ClienteModel> ReadAllCliente(ClienteModel model);
    
    
    //Ordine

    bool CreateProdotto(ProdottoModel model);
    void UpdateProdotto(ProdottoModel model);
    void DeleteProdotto(ProdottoModel model);
    List<ProdottoModel> ReadAllProdotto(ProdottoModel model);
}

我用来更新 商店的 列表框的代码是:

private void aggiornaListeButton_Click(object sender, EventArgs e)
    {
        CarrelloModel carrelloModel = null;
        carrelloModel = new CarrelloModel();
        var memoryCarrello = dbMemoryManager.ReadAllCarrello(carrelloModel);
        carrelloListBox.Items.Clear();
        foreach (CarrelloModel model in memoryCarrello)
        {
            carrelloListBox.Items.Add(String.Format("{0} {1}", carrelloModel.RiferimentoIDCliente, carrelloModel.RiferimentoIDProdotto));
        }

        ClienteModel clienteModel = null;
        clienteModel = new ClienteModel();
        var memoryClienti = dbMemoryManager.ReadAllCliente(clienteModel);
        clientiListBox.Items.Clear();
        foreach (ClienteModel model in memoryClienti)
        {
            clientiListBox.Items.Add(String.Format("{0} {1} {2}", clienteModel.Cognome, clienteModel.Nome, clienteModel.Indirizzo));
        }

        ProdottoModel prodottoModel = null;
        prodottoModel = new ProdottoModel();
        var memoryProdotti = dbMemoryManager.ReadAllProdotto(prodottoModel);
        prodottiListBox.Items.Clear();
        foreach (ProdottoModel model in memoryProdotti)
        {
            prodottiListBox.Items.Add(String.Format("{0} {1}", prodottoModel.DescrizioneArticolo, prodottoModel.DataProdotto));
        }
    }

您可以看到的 ReadAll 方法都是相同的,但是每个 return 都是我的三个列表之一,因此我可以获得整个列表并根据需要使用它,这是一个示例:

        public List<CarrelloModel> ReadAllCarrello(CarrelloModel model)
    {
        bool empty = !MemoryCarrello.Any();
        if (empty)
        {
            MessageBox.Show("Carello vuoto");
        }
        else
        {
            MessageBox.Show("Testing");
        }
        return MemoryCarrello;
    }

当我按下 return 按钮去购物,并尝试更新列表时,那些是空的,因为商店无法通过控制台访问列表更新,即使我使用 ReadAll 方法,那应该是差异的原因,我该怎么办?我快疯了。提前致谢。

Shop class 和 ConsoleAnagrafica 表单有两个不同的 DBManager 实例。您在其中一个实例中放置的内容不在另一个实例中。您需要传递单个 DBMemoryManager 实例(第一个创建的实例)并始终使用该实例。

因此,例如,假设 ConsoleAnagrafica 是您应用程序的主要形式,并且您从该主要形式打开 Shop 形式,您可以

public partial class ConsoleAnagrafica : Form
{
    //Istanziazione [0]

    DBMemoryManager dbMemoryManager = null;

    public ConsoleAnagrafica()
    {
        InitializeComponent();
        dbMemoryManager = new DBMemoryManager();
    }

    // Some click event from button or menu that opens the shop form
    private void OpenShop_Click(object sender, EventArgs e)
    {
        // Pass the instance in the ConsoleAnagrafica to new Shop instance
        Shop Login = new Shop(dbMemoryManager);
        Login.Show();
    }

}

然后在 Shop 构造函数中,您会收到从控制台传递的实例,如

public partial class Shop : Form
{
    DBMemoryManager dbMemoryManager = null;

    public Shop(DBMemoryManager mgr)
    {
        InitializeComponent();
        dbMemoryManager = mgr;
    }

现在商店表单中的实例与在控制台表单中创建的实例相同。如果有更多表单需要访问同一个 DBMemoryManager 实例,这种方法很容易变成噩梦。