在方法和表单之间传递数据 (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 实例,这种方法很容易变成噩梦。
我有两种形式,一种是 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 实例,这种方法很容易变成噩梦。