Другие языки программирования и технологии

Некорректно работает код. (C#)

Здравствуйте, я только учусь c# и много еще не знаю, пожалуйста помогите =). Ниже приведенный код не работает так как задумано. Стоит задача вводить в первый текстбокс имена, по кнопке заносить их в список, а по нажатию на вторую кнопку показывать все элементы списка, но по какой-то причине показывается только последнее введенное слово. Подскажите в чем проблема. Спасибо.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication21
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

Calc calc;
class Calc
{
public string text;

public List temp = new List();

public Calc(string str)
{
text = str;
}
}

private void button1_Click(object sender, EventArgs e)
{
calc = new Calc(textBox1.Text);
calc.temp.Add(calc.text);
textBox1.Text = "";
}

private void button2_Click(object sender, EventArgs e)
{
foreach(string c in calc.temp)
{
textBox2.Text = c + "\r\n";
}
}
}
}
Во-первых
Класс List - это обобщение. Находится в пространстве сборки System.Collections.Generic.
При создании таких классов используют следующий синтаксис:
Класс<тип> экзКласса, то есть в вашем случае List<тип> temp. Где тип - string
Это означает, что вы создаете список определенного типа.
Хотя, возможно, изначально у вас было так и написано в коде, а mail воспринял это как тег

Во-вторых, тут ошибка, на которую указал Александр. Хотя, я бы тут с ним не согласился.
Дело в том, что у вас так код написан, что его нужно переписывать. Если вы перенесете в конструктор, то проблема не решится. Короче.. лучше скину правильный вариант

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
List calc = new List();

private void button1_Click(object sender, EventArgs e)
{
calc.Add(textBox1.Text);
textBox1.Text = "";
}

private void button2_Click(object sender, EventArgs e)
{
foreach (string t in calc)
{
textBox2.Text += t + "\r\n";
}
}
}
}
Если вы хотите использовать этот вложенный класс.. то можно записать так

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

Calc calc = new Calc();
class Calc
{
public List temp = new List();
}
private void button1_Click(object sender, EventArgs e)
{
calc.temp.Add(textBox1.Text);
textBox1.Text = "";
}

private void button2_Click(object sender, EventArgs e)
{
foreach (string t in calc.temp)
{
textBox2.Text += t + "\r\n";
}
}
}
Ну вообще так лучше не писать, потому что это неправильно и неуважительно к программисту, который будет после вас работать с этим кодом (это на будущее). Порекомендовал бы вам почитать про паттерны проектирования, а ещё почитали бы Кнута "Искусство программирования"
Сергей Павлюков
Сергей Павлюков
386
Лучший ответ
Колягин Леонид Спасибо большое, Ваш код работает =)
textBox2.Text = c + "\r\n"; - Тут ты тоже поочередно меняешь текст в цикле - последнее значение остается, да.
* Тамерлан *
63 902
Ну так и чего-ты удивляешься. На вот эту строчку calc = new Calc(textBox1.Text); обрати внимание. Ты каждый раз по кнопке создаешь новый объект типа Calc. Помести создание объекта Calc в конструктор формы и проблема решиться.
есть рабочий проект напиши куда отправить
Колягин Леонид cryptoscypher@gmail.com