idman9620 Ответов: 2

Отображение нескольких записей базы данных в messagebox


Я пытаюсь отобразить записи базы данных в messagebox через цикл, но каждый раз, когда программа выполняется, я получаю только одну запись. Теперь я застрял здесь...

Что я уже пробовал:

частный недействительными checkProductParLevelBreach()
{
Список<строка> У dataInTableInventory = новый список<строка&ГТ;();
int parLevel = 50;
использование (соединение)
using (var messageQuery = new SqlCommand ("select * from Inventory", connection))
{
соединение.Открыть();
Класс sqldatareader объекта DataReader = messageQuery.Метода executereader();
объект DataReader.Читать();
for (int i = 0; i <= datareader.FieldCount; i++)
{
if (parLevel > Int32. Parse(datareader[4].Метод toString()))
{
строка selectID = datareader[0].Метод toString();
dataInTableInventory.Добавить (selectID);
}
}

foreach (String product in dataInTableInventory)
{
строка ModelName = datareader[2].Метод toString();
Ящик для сообщений.Показать(параметр modelname + " вышли на уровень номинальной продукт!", MessageBoxIcon.Предупреждение.Метод toString());
}
}
}

2 Ответов

Рейтинг:
5

OriginalGriff

Ну, да... вы будете.
Посмотрите на свой код: вы только когда - либо выполняете одно чтение в своем DataReader, а затем выполняете цикл на FieldCount - который является количеством столбцов для строки-и только когда-либо повторно обращаетесь к первому столбцу внутри этого цикла.
Если вы хотите получить доступ к нескольким столбцам, вам нужно использовать for переменная цикла i; если вы хотите получить доступ к нескольким строкам, то вам нужен while цикл выполнения нескольких операций чтения в DataReader для извлечения каждой строки по очереди:

using (SqlDataReader datareader = messageQuery.ExecuteReader())
   {
   while (datareader.Read())
      {
      ...
      dataInTableInventory.Add(selectID);
      }
   }


И, пожалуйста, сделай себе одолжение: не делай этого. SELECT * запросы, вместо этого назовите столбцы. Это особенно важно, когда вы используете доступ к нумерованным столбцам, так как небольшое изменение в вашей БД может сделать некоторые ужасные вещи с вашим кодом! Кроме того, не очень неэффективно извлекать столбцы, которые вы не используете: поэтому извлекать каждый столбец вашей таблицы, чтобы использовать только первый и пятый, как вы это делаете, не очень хорошая идея.


Рейтинг:
0

BillWoodruff

Во-первых, поймите ответ OriginalGriff, опубликованный здесь, и убедитесь, что ваш код делает "правильную вещь" для отображения данных, которые вы хотите, чтобы пользователь видел.

Затем:

Я настоятельно рекомендую вам использовать отдельную форму для отображения ваших данных. Вы можете показать форму модально, используя 'ShowDialog, и передать обратно' DialogResult и / или другую информацию.

Посмотрите, как это просто: предположим, что у вас есть

a. создал форму с именем 'DataDisplayDialogForm,

б. у вас есть скрытые формы контроля заголовке при установке ControlBox = false в

c. вы поместили на него одну кнопку с именем " btnExit

d. вы поставили на нем один флажок под названием " cbxApproved

e. Вы установили свойство 'AcceptButton формы в' btnExit

f. вы поместили все элементы управления для отображения данных в форму и реализовали методы для отображения данных.

Пример формы для использования в качестве диалогового окна:

using System;
using System.Windows.Forms;

namespace YourNameSpace
{
    public partial class DataDisplayDialogForm : Form
    {
        public DataDisplayDialogForm()
        {
            InitializeComponent();
        }

        private void DataDisplayDialogForm_Load(object sender, EventArgs e)
        {
            this.DialogResult = DialogResult.No;
        }

        private void btnExit_Click(object sender, EventArgs e)
        {
            this.DialogResult = (cbxApproved.Checked)
                ? DialogResult.Yes
                : DialogResult.No;
            
            this.Close();
        }
    }
}
Затем вы можете отобразить пример этой формы в виде диалогового окна из вашей основной формы и показывать этот экземпляр в виде диалогового окна при нажатии кнопки:
private DataDisplayDialogForm dataForm;

private void MainForm_Load(object sender, EventArgs e)
{
    dataForm = new DataDisplayDialogForm();
}

private void ShowDataButton_Click(object sender, EventArgs e)
{
    DialogResult viewResult = dataForm.ShowDialog();

    if (viewResult == DialogResult.Yes)
    {
        // data approved
    }
    else
    {
        // data not approved
    }
}
Как вы можете видеть, DialogResult, возвращаемый в основную форму при закрытии экземпляра пользовательской диалоговой формы, будет зависеть от того, установлен ли флажок в пользовательском диалоге или нет.

Когда вам нужно передать обратно пользовательские данные, а не только значение перечисления DialogResult, это можно сделать несколькими способами: путем создания пользовательского класса для "отправки обратно"; с помощью вызова событий, возможно, с помощью пользовательского класса EventArgs и т. д. Или вы можете предоставить доступ к элементам управления, используемым для отображения данных, установив общедоступные свойства, содержащие ссылки на них. И есть другие методы.