【问题标题】:Pass datas between methods and forms (List<t>)在方法和表单之间传递数据 (List<t>)
【发布时间】:2020-09-03 21:09:32
【问题描述】:

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

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

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

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

这是 shop 起始代码:

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 方法都是相同的,但是每个方法都返回我的三个列表中的一个,因此我可以获取整个列表并根据需要使用它,这是一个示例:

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

当我按下按钮返回商店并尝试更新列表时,这些列表是空的,因为商店无法访问控制台更新的列表,即使我使用 ReadAll 方法,这也应该是差异的原因实例,我该怎么办?我快疯了。提前致谢。

【问题讨论】:

  • Shop 类和 ConsoleAnagrafica 表单有两个不同的 DBManager 实例。您在其中一个实例中放入的内容不在另一个实例中。您需要传递单个 DBManager 实例(第一个创建的)并始终使用相同的实例。另一种选择是使 DBManager 成为静态类
  • 因为我对 c# 还很陌生,所以我不知道如何为不同的表单提供相同的 DBManager 实例。我该怎么办?
  • 顺便说一句,我不能让 DBManager 公开,因为那是一个接口,我也不能让 DBMemoryManager 成为静态的,因为我不会被允许使用我的方法。

标签: c# list forms methods interface


【解决方案1】:

Shop 类和 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;
    }

现在 Shop 表单中的实例与 Console 表单中创建的实例相同。如果有更多的表单需要访问同一个 DBMemoryManager 实例,这种方法很容易成为一场噩梦。

【讨论】:

  • 好像行得通,不用担心更多的形式,因为那只是练习和学习,所以我不会在类似的情况下使用它。非常感谢!
  • 顺便说一句,你能检查一下 aggiornaListeButton_Click 有什么问题吗?事件应该更新列表框,但我可以看到购物车项目,但看不到客户和产品,即使这是相同的功能,并且我可以通过调试器看到,列表已填充。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-17
  • 2012-06-18
相关资源
最近更新 更多