Как я могу читать текстовый файл в C# с foreach и добавлять это в labels динамические?

Я использую C# и разрабатываю приложение в WindowsForm с намерением создать Чат со связью MySQL. Сообщения будут храниться в базе данных, после перевернется в систему в TXT, и будет создан label динамической формы с каждой линией TXT.

Моя проблема появляется в создании label динамической формы. Я использую цикл foreach, но оно не функционирует, потому что я не добиваюсь, чтобы он показал каждую линию:

sql.sqlcmd("SELECT COUNT(*) FROM chat");
int count = int.Parse(sql.sqlcmd_answ);

foreach (string line in File.ReadLines("mac.txt"))
{
    int i = 0;
    int p = 62;
    while (i < count)
    {
        Console.WriteLine(line);
        Label lb = new Label();
        lb.Text = line;
        lb.Location = new Point(58, p);
        p = p + 30;
        panel1.Controls.Add(lb);
        ++i; 
    }
}

Файл содержит эти линии:

1222
22222
Chat...
fxckxd
fxckxd
fxck
ffff
cambio
Chat...heya
22222
Xd
Xd
DDDD3EEEE
DDDD

Но он производит мне эти labels:

introducir la descripción de la imagen aquí

foreach он не меняет стоимость переменной line, только покажи первую линию вместо всех.

3
задан 15.01.2017, 16:35
0 ответов

Проблема, которая у тебя есть,, - потому что ты укрыл 2 цикла, когда у тебя в действительности должен бы быть 1 только.

Первый цикл работает 1 раз из-за каждой линии:

foreach (string line in File.ReadLines("mac.txt"))

но, для каждой из этих линий, ты выполняешь другой цикл:

    while (i < count)

А именно, если count == 14, следующий код будет работать 14 раз:

        // ...
        lb.Text = line;
        // ...
        panel1.Controls.Add(lb);

но каждый из 14 раз, line продолжи содержать ту же стоимость (той же прочитанной линии).

Кроме того, как переменная p он возобновляется в 62 для каждой прочитанной линии, ты помещаешь каждый 14 labels для каждой из линий из-за на предыдущих.


Как решать это?

Он избыточный, что ты использовал как предел количество реестров в базе данных, если просто то, что ты хочешь сделать, состоит в том, чтобы производить label для каждой линии файла. Просто foreachон идет поручать повторять однажды с каждой линией:

int p = 62; //se inicializa 1 sola vez, fuera del loop

foreach (string line in File.ReadLines("mac.txt"))
{
    Console.WriteLine(line);

    Label lb = new Label();
    lb.Text = line;
    lb.Location = new Point(58, p);
    p = p + 30;
    panel1.Controls.Add(lb);
}
2
ответ дан 03.12.2019, 17:40
  • 1
    Сначала всего большое спасибо!, ¿ Qué mé совсем альтернативный ты рекомендуешь мне File. ReadLines ()? Я gustarí чтобы получать лучший результат. ¿ В qué эта ошибка проистекает? image.prntscr.com/image/8ee41d1724174d5db66a60a77b91fda4.png –  15.01.2017, 14:53
  • 2
    @JoseAviles был ошибкой из-за того, что не проверил перед тем, как печатать. Я habí в запутанный с File.ReadAllLines. Относительно эффективности, в этом этапе ты recomendarí когда está продолжает быть такой каков; s делая, так как это может не быть má s работоспособный, но это не снимает, что я функционировал má s, что хорошо. Как только у тебя была вся смазка, если бы ты хотел, podrí схвати оценивать использование StreamReader. ReadLine . Edité ответ. –  15.01.2017, 15:02