更新List <t>对象及其属性

问题描述

我有一个列表MemoryClienti,其中包含基于ClienteModel类的项目。

我用来向MemoryClienti添加新的项目方法是:

        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上找到),但是我认为这足以使您入门。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...