问题描述
我有一个列表MemoryClienti
,其中包含基于ClienteModel
类的项目。
public bool CreateCliente(ClienteModel model)
{
bool empty = !MemoryClienti.Any();
if (empty)
{
ClienteModel clienteModel = new ClienteModel();
clienteModel.Cognome = model.Cognome;
clienteModel.Nome = model.Nome;
clienteModel.Indirizzo = model.Indirizzo;
clienteModel.IDCliente = StartID;
MemoryClienti.Add(clienteModel);
MessageBox.Show("Cliente aggiunto correttamente.");
}
else
{
int maxID = MemoryClienti.Count;
ClienteModel clienteModel = new ClienteModel();
clienteModel.Cognome = model.Cognome;
clienteModel.Nome = model.Nome;
clienteModel.Indirizzo = model.Indirizzo;
clienteModel.IDCliente = maxID;
MemoryClienti.Add(clienteModel);
MessageBox.Show("Cliente aggiunto correttamente.");
}
return true;
此方法使我能够添加新项目,对列表中的项目数进行计数,并根据计数结果设置新项目的ID,因此它适用于我添加的每个项目,并且可以正常工作。
项目的“模型”的数据来自表单的文本框:
private void aggiungiClienteButton_Click(object sender,EventArgs e)
{
if (cognomeTextBox.Text == "")
{
MessageBox.Show("Uno o più campi sono vuoti");
}
else if (nomeTextBox.Text=="")
{
MessageBox.Show("Uno o più campi sono vuoti");
}
else if (indirizzoTextBox.Text == "")
{
MessageBox.Show("Uno o più campi sono vuoti");
}
else
{
clienteModel.Cognome = cognomeTextBox.Text;
clienteModel.Nome = nomeTextBox.Text;
clienteModel.Indirizzo = indirizzoTextBox.Text;
dbMemoryManager.CreateCliente(clienteModel);
cognomeTextBox.Text = String.Empty;
nomeTextBox.Text = String.Empty;
indirizzoTextBox.Text = String.Empty;
}
}
我的班是:
public class ClienteModel
{
public int IDCliente { get; set; }
public string Cognome { get; set; }
public string Nome { get; set; }
public string Indirizzo { get; set; }
}
问题是:如何在不更改id的情况下使用文本框更新其中的一个?
解决方法
这是一个快速而肮脏的解决方案。您没有指定要使用哪种文本框。我假设它是Windows窗体。
我修改了ClienteModel,使其看起来像这样:
public class ClienteModel
{
private static int _currentId = 0;
public int IDCliente { get; set; } = _currentId++;
public string Cognome { get; set; }
public string Nome { get; set; }
public string Indirizzo { get; set; }
public override string ToString()
{
return Nome;
}
}
请注意,它现在管理IDCliente
字段,并且具有ToString
成员(您可以将其设置为所需的任何字符串)。您可能希望在表单的只读文本框中显示IDCliente
字段。
然后,我创建了一个简单的Windows窗体窗体,该窗体具有您的三个文本框,一个名为ModelsListBox
的列表框和两个按钮AddButton
(标题:“添加”)和UpdateButton
(“更新” “)。
在表单类中,我创建了一个小的验证方法(因为我在两个地方使用了它)。请注意,即使遇到多个错误,您也只会得到一个MessageBox:
private bool ValidateFields()
{
var errors = new List<string>();
foreach (var tb in new[] {cognomeTextBox,nomeTextBox,indirizzoTextbox})
{
if (string.IsNullOrWhiteSpace(tb.Text))
{
errors.Add($"{tb.Name} must not be empty");
}
}
if (errors.Count > 0)
{
MessageBox.Show(string.Join(Environment.NewLine,errors),"Errors",MessageBoxButtons.OK,MessageBoxIcon.Error);
return false;
}
//otherwise
return true;
}
然后,我添加了三个事件处理程序(从设计器内部以常规方式将它们连接起来)。第一种是按下添加按钮时:
private void AddButton_Click(object sender,EventArgs e)
{
if (!ValidateFields())
{
return;
}
var model = new ClienteModel
{
Cognome = cognomeTextBox.Text,Nome = nomeTextBox.Text,Indirizzo = indirizzoTextbox.Text,};
ModelsListBox.Items.Add(model);
}
它将创建一个新的ClienteModel
并将其添加到列表框中(假设通过验证)。
然后,我创建了一个处理程序,只要列表框中的选择发生更改,该处理程序就会更新文本框:
private void ModelsListBox_SelectedIndexChanged(object sender,EventArgs e)
{
if (ModelsListBox.SelectedItem is ClienteModel model)
{
cognomeTextBox.Text = model.Cognome;
nomeTextBox.Text = model.Nome;
indirizzoTextbox.Text = model.Indirizzo;
}
}
最后是一个更新按钮处理程序:
private void UpdateButton_Click(object sender,EventArgs e)
{
if (!ValidateFields())
{
return;
}
if (ModelsListBox.SelectedItem is ClienteModel model)
{
model.Cognome = cognomeTextBox.Text;
model.Nome = nomeTextBox.Text;
model.Indirizzo = indirizzoTextbox.Text;
}
}
这不是完美的。您应该禁用“更新”按钮,直到做出选择为止(并且可能只有在文本框中进行更改之后才能启用)。
更重要的是,项目列表框中显示的字符串基于将项目首次添加到列表时对ClienteModel.ToString
进行调用的结果。如果您更改用于计算.ToString
的字段的值,则列表框不会更新。有几种解决方法(可在Stack Overflow上找到),但是我认为这足以使您入门。