Tengo una lista MemoryClienti con elementos basados ​​en la clase ClienteModel.

El método que utilizo para agregar un elemento nuevo a MemoryClienti es:

        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;

Este método me permite agregar un nuevo elemento, contar la cantidad de elementos en la lista y establecer la identificación del nuevo elemento como resultado del recuento, por lo que sucede con cada elemento que agrego y está funcionando.

Los datos para el "modelo" del elemento provienen de los cuadros de texto del formulario:

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

Mi clase es:

    public class ClienteModel
{
    public int IDCliente { get; set; }
    public string Cognome { get; set; }
    public string Nome { get; set; }
    public string Indirizzo { get; set; }

}

El problema es: ¿cómo puedo actualizar uno de esos elementos usando cuadros de texto sin cambiar la identificación?

-2
notsosmart 26 ago. 2020 a las 00:20

1 respuesta

La mejor respuesta

Aquí tienes una solución rápida y sucia. No especifica qué tipo de cuadros de texto está utilizando. Supongo que es Windows Forms.

Modifiqué su ClienteModel para que se vea así:

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

Tenga en cuenta que administra el campo IDCliente ahora y que tiene un miembro ToString (puede configurarlo en la cadena que desee). Es posible que desee mostrar el campo IDCliente en un cuadro de texto de solo lectura en su formulario.

Luego creé un formulario simple de Windows Forms que tiene sus tres cuadros de texto, un ListBox llamado ModelsListBox y dos botones AddButton (título: "Agregar") y UpdateButton ("Actualizar").

En la clase de formulario creé un pequeño método de validación (ya que lo uso en dos lugares). Tenga en cuenta que solo obtendrá un cuadro de mensaje incluso si tiene varios errores:

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

Luego agregué tres controladores de eventos (conectándolos de la manera normal desde el diseñador). La primera es cuando se presiona el botón Agregar:

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

Crea un nuevo ClienteModel y lo agrega al cuadro de lista (asumiendo que pasa la validación).

Luego, creé un controlador que actualiza los cuadros de texto cada vez que cambia la selección en el cuadro de lista:

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

Y finalmente, un controlador de botón de actualización:

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

Esto no es perfecto. Debe deshabilitar el botón Actualizar hasta que se realice una selección (y tal vez habilitar solo después de realizar un cambio en el cuadro de texto).

Más importante aún, la cadena que se muestra en el cuadro de lista para un elemento se basa en los resultados de una llamada a ClienteModel.ToString realizada cuando el elemento se agrega por primera vez a la lista. Si cambia el valor de un campo que se usa para calcular .ToString, el cuadro de lista no se actualiza. Hay algunas formas de evitar esto (que se pueden encontrar en Stack Overflow), pero pensé que esto sería suficiente para comenzar.

1
Flydog57 25 ago. 2020 a las 23:54