2016-01-29 2 views
0

Я хочу напечатать лист счета.Печать значений и выравнивание C#

Список всех счетов-фактур получен этой командой в списке.

con.Open();     
      MySqlCommand command1 = con.CreateCommand(); 
      MySqlDataReader Reader; 
      command1.CommandText = "SELECT service,price FROM `order` WHERE billno='" + label15.Text + "' AND dates=DATE(NOW())"; 
      Reader = command1.ExecuteReader(); 
      while (Reader.Read()) 
      { 
       string thisrow = "";      
       for (int k = 0; k < Reader.FieldCount; k++)       
        thisrow += Reader.GetValue(k).ToString() +"".PadRight(10); 
        listBox1.Items.Add(thisrow);      
      } 
      con.Close(); 

Теперь я хочу, чтобы распечатать их с помощью этого кода

foreach (string item in listBox1.Items) 
      {      
       string Service = item;          
       { 
        e.Graphics.DrawString(Service, new Font("Courier New", 12, FontStyle.Italic), new SolidBrush(Color.Black), 10, 10 + offset); 
        offset = offset + (int)fontHeight + 5; 
       } 
      } 

печать происходит, но выравнивание всех цен неверны. enter image description here

+3

Какую структуру пользовательского интерфейса вы используете? Это веб-приложение или приложение Windows? Чтобы гарантировать точное форматирование, считаете ли вы создание pdf-документа, который затем печатают ваши пользователи? Кроме того, вам следует рассмотреть возможность параметризации вашего SQL-запроса для предотвращения атак SQL-инъекций. –

+1

Имеет ли эта технология пользовательского интерфейса какой-либо вид таблицы, который вы можете использовать? Это кажется подходящим для такого рода данных. – David

+0

@RichardEverett это приложение для формы окон –

ответ

0

Я решил использовать этот метод.

foreach (string item in listBox1.Items) 
     {     
      string service = item.Substring(0,item.Length-3); 
      string price = item.Substring(item.Length - 3, 3); 
      { 

       e.Graphics.DrawString(service, new Font("Courier New", 12, FontStyle.Italic), new SolidBrush(Color.Black), 10, 10 + offset); 
       e.Graphics.DrawString("".PadRight(14)+price, new Font("Courier New", 12, FontStyle.Italic), new SolidBrush(Color.Black), 10, 10 + offset); 
       offset = offset + (int)fontHeight + 5; 
      } 
     } 
+0

Один из перегрузок от DrawString принимает аргумент StringFormat, вы можете использовать его для правильного выравнивания speficy. Также обратите внимание, что вы создаете новые шрифты и кисти на каждой итерации и не располагаете их так, как вы должны –

0

Неправильные установки из-за .PadRight(10).
"GROOM (M)" и "Style (M)" оба имеют 9 символов, где "WAX (M)" имеет 7 символов. Это может быть причиной, почему цифры 8 и 6 имеют неправильное выравнивание.

+0

Я знаю, что ... можете ли вы предоставить мне решение, пожалуйста. –

0

Чтобы решить ближайшую проблему, вы можете подумать о том, чтобы сделать вашу строку service предсказуемой длиной, возможно, используя String.PadRight(), например. item.PadRight(16);, чтобы заставить его иметь длину 16 символов. Затем добавьте цену, и у вас будет ваше смещение.

Это немного взломать. Вы используете Windows Forms, который имеет DataGridView для приятных табуляционных макетов. Или, если вы собираетесь распечатать эту информацию, рассмотрите вывод в предсказуемый формат, например XPS или PDF.

Также обратите внимание на другие предложения о том, как улучшить код с помощью parameterized SQL queries!

0

Если вы используете шрифт «курьером нового», то каждый персонаж имеет одинаковый размер. убедитесь, что ваш список услуг имеет максимальный характер. например 10, так что вы можете с помощью padleft или padright

your_string.PadLeft(10, " "); 
+0

можете ли вы применить это в своем коде? –

0

Я не уверен, что точные значения, которые вы можете получить, но я полагаю, что ваш вклад стиля item (M) price. Итак, вместо того, чтобы использовать PadRight(10), почему бы не вставить пробелы внутри себя? Допустим, вы отбросите это дополнение и построите только простую строку. Итак, вы получите что-то вроде WAX (M) 15. Это 10 символов. Это может быть достигнуто с исходным кодом только с небольшой модификацией от:

thisrow += Reader.GetValue(k).ToString() +"".PadRight(10); 

к этому:

thisrow += Reader.GetValue(k).ToString(); 

Тогда я бы искать последнее место и добавить достаточное количество дополнительных мест, чтобы сделать соответствующую длину линия. Так идут от исходной линии

string Service = item; 

к чему-то вроде:

int billLineLength = 20; 
string service = item; 

int missingSpaces = billLineLength - service.Length; 

if(missingSpaces > 0) { 
    string filler = ""; 
    for(int i = 0; i < missingSpaces; i++) { 
     filler += " "; 
    } 
    service = service.Insert(service.LastIndexOf(' '), filler); 
} 

Through, вы должны будете экспериментировать с billLineLenght немного, чтобы идеально вписываться в ваш ожидаемого результата.

Я надеюсь, что это вам поможет.


Как примечание стороны, я бы порекомендовал вам прекратить называть переменные с заглавной буквы, так как Reader.FieldCount действительно выглядит, как вы используете свойство статического класса, в то время как на самом деле является переменной. Это помогает прояснить код для любого читателя.

+0

Он работает для первых двух значений не для воска ... могу ли я сделать это с помощью dataGridview? вместо списка? если да, пожалуйста, помогите мне ... –

+0

Ухм, не могли бы вы объяснить более подробно, что не работает? Является ли линия короткой, длинной, ...? – Rao

0

Видимо, вам не понравилась моя предыдущая идея, поэтому я попробую другое решение. Это не дает вам столько усилий в этом процессе, но может вас устраивать, поскольку это проще. И я не редактирую оригинальный ответ, потому что он стоит, и этот предлагает другой подход.

Я полагаю, что вы хотели бы, чтобы цены были выровнены по правому краю и впереди были пробелы. Ваша проблема в том, что код

thisrow += Reader.GetValue(k).ToString() +"".PadRight(10); 

принимает значение от считывателя (Reader.GetValue(k)), преобразует его в строку (.ToString()), а затем присоединяет пустая строка (""), дополненный пробелами на правой поэтому его общая длина составляет 10 ("".PadRight(10) изменяется на " " - десять пробелов), а затем добавляет все это к вашей переменной thisrow. То, что вы, вероятно, ищете, это PadLeft, который добавляет пробелы в , оставив, и он должен быть выполнен на полученном и преобразованном значении. I.E .:

thisrow += Reader.GetValue(k).ToString().PadLeft(10); 
Смежные вопросы