chenglll Ответов: 3

Как напечатать студенческий билет, основанные на флажок элементом управления datagridview проверяли?


Привет Эксперты,

Я очень новичок в .NET (c#), поэтому, пожалуйста, помогите мне решить мою проблему, я создаю простой студенческий проект. В этом проекте я создал форму для отображения данных из базы данных sql в dgPrintIDCard, я добавил еще один столбец "ячейки[0]" для флажка в dgPrintIDCard, а затем у меня есть кнопка print card для печати отмеченной строки в dgPrintIDCard. Это работает, если я проверил только одну запись, но это не работает, когда я проверил несколько записей. Он показывает несколько crystal report вместо одного crystal report show и показывает все студенческие удостоверения личности относительно проверенных строк. Пожалуйста, смотрите мой код ниже.

Моя цель такова: когда я проверил только одну строку, система покажет только одну карту в кристалле
Когда я проверил 3 строки, система покажет 3 карты в кристалле

Мы очень ценим вашу помощь.
С уважением,
Ченг

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

foreach (DataGridViewRow item in dgPrintIDCard.Rows)
                  {
                      if (item.Cells[0].Value != null)
                      {
                          var stID = item.Cells[1].Value;//Student ID is in cells[1]

                          con = new SqlConnection(cs.DBcon);
                          con.Open();
                          string query = "SELECT * FROM student WHERE s_id = '" + stID + "'"; 
                          cmd = new SqlCommand(query, con);
                          printPreviewGlobalVar.mReport = "prntStudentCard";
                          printPreviewGlobalVar.mSqlstr = query;
                          prntPreview prnt = new prntPreview();
                          prnt.Show(); 

                          this.Close();//close current form
                      }                    
                  }

3 Ответов

Рейтинг:
2

OriginalGriff

Выньте закрытие в конце if - если вы закроете форму, она уничтожит форму и все ее элементы управления, включая DataGridView, из которого вы пытаетесь получить информацию...


chenglll

Я попробовал это сделать, но все равно получил тот же результат.

Рейтинг:
14

Maciej Los

Прежде всего, пожалуйста, внимательно прочтите оригинальное решение Гриффа.

Во-вторых, ваш запрос предназначен для одного студента одновременно:

"SELECT * FROM student WHERE s_id = '" + stID + "'";

Кстати: такой запрос есть SQL-инъекция[^] уязвимый!
Вы должны создать запрос, который принимает несколько идентификаторов, чтобы иметь возможность отображать выбранные карты. Видеть: IN (Transact-SQL) - SQL Server | Microsoft Docs[^]
StringBuilder sb = new StringBuilder();
foreach (DataGridViewRow item in dgPrintIDCard.Rows)
{
    if (item.Cells[0].Value != null)
    {
        var stID = item.Cells[1].Value.ToString();//Student ID is in cells[1]
        sb.Append($"{stID},");
    }                    
}

string query = $"SELECT * FROM student WHERE s_id IN ({sb.ToString().TrimEnd(',')})"; 
con = new SqlConnection(cs.DBcon);
con.Open();
cmd = new SqlCommand(query, con);
printPreviewGlobalVar.mReport = "prntStudentCard";
printPreviewGlobalVar.mSqlstr = query;
prntPreview prnt = new prntPreview();
prnt.Show(); 
this.Close();//close current form


Примечание:
Я, используя класс StringBuilder, поскольку объект String является неизменяемым! Видеть: Строки - Руководство По Программированию На C# | Microsoft Docs[^]

Связи:
Класс StringBuilder (System.Text) | Microsoft Docs[^]
Строка.Метод TrimEnd (Система) | Microsoft Docs[^]


chenglll

Большое вам спасибо, Мацей Лос.

Я очень благодарен вам за Вашу поддержку, теперь она работает на меня. :)

Maciej Los

Всегда пожалуйста.

Рейтинг:
0

JU571C3

Поставьте Контер для каждой выбранной строки, тогда вы сможете увидеть каждую карту или распечатать все, что хотите напечатать(это работает, по крайней мере, для меня)
То как вы это сделали мне кажется что будет распечатана только первая выбранная строка