2016-03-17 3 views
1

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

Я просмотрел метод Graphics и выполнил тест, показанный в приведенном ниже коде. Я получил некоторые переменные, определенные в другом методе, и я хочу напечатать содержимое этих переменных рядом со строкой. Может ли кто-нибудь руководствоваться этим, используя графический метод?

private void btn_print_Click(object sender, RoutedEventArgs e) 
    { 
     try 
     { 
      PrintDocument pd = new PrintDocument(); 
      pd.DefaultPageSettings.PaperSize = new PaperSize("A4", 827, 1169); 
      pd.PrintPage += new PrintPageEventHandler(this.pd_PrintPage); 
      pd.Print(); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show("An error occurred while printing", ex.ToString()); 
     } 
    } 

    private void pd_PrintPage(object sender, PrintPageEventArgs e) 
    {    
     String drawString = "Test"; 
     e.Graphics.DrawString(drawString, new Font("Verdana", 14), new SolidBrush(System.Drawing.Color.Black), 20,20); 
    } 

Вот код кнопки, определяющего переменные:

private void btn_calculate_Click(object sender, RoutedEventArgs e) 
    { 
     int aa = Int32.Parse(tb_windvelocity.Text); 
     int bb = Int32.Parse(tb_height.Text); 
     int cc = Int32.Parse(tb_area.Text); 
     int dd = Int32.Parse(tb_sc.Text); 
     double ee = Math.Sin((Int32.Parse(tb_angle.Text)) * (Math.PI/180)); 

     double g = 0; 
     if (this.cb_gust.SelectedItem==cb_gust1) 
     { 
      g = 3; 
     } 
     else if(this.cb_gust.SelectedItem == cb_gust2) 
     { 
      g = 15; 
     } 


     double ff = 5.73 * (Math.Pow(10,-2)) * (Math.Sqrt(1 + (0.15 * aa))); 

     double gg = aa * (1 + (ff * (Math.Log(bb/10)))); 

     double hh = 0.06 * (1 + (0.043 * aa)) * Math.Pow((bb/10), (-0.22)); 

     double ii = gg * (1 - (0.41 * hh * Math.Log(g/3600))); 

     double jj1 = (0.5 * 1.225 * dd * cc * Math.Pow(ii, 2) * ee)/1000; 
     double jj2 = (0.5 * 1.225 * dd * Math.Pow(ii, 2) * ee)/1000; 
     lbl_windaction1.Content = Math.Round(jj1,2); 
     lbl_windaction2.Content = Math.Round(jj2,2); 

    } 
+0

Вы не можете получить доступ к локальным переменным__ из любого другого метода, независимо от того, с какой целью. Поэтому самое простое решение - переместить их на __class level__, возможно, в класс и его члены, возможно, в «DataTable» или если вы хотите увидеть их в «DataGridView» или просто один или несколько «Список » и т. Д. . - Какой тип хранилища лучше всего на самом деле зависит от того, что такое контент и его источник .. – TaW

+0

Хорошо, так что скажем, я перемещаю их на уровень класса. Можно ли использовать метод Graphics для печати значения из них? Я использую двойники. @TaW –

+0

Да, конечно. Метод DrawString может обращаться к ним так же, как ваш 'string drawString'. Вы добавляете красивую строку форматирования! – TaW

ответ

2
private string getMyString() 
{ 
    return "Hello world"; 
} 

private void pd_PrintPage(object sender, PrintPageEventArgs e) 
{    
    String drawString = this.getMyString(); 
    e.Graphics.DrawString(drawString, new Font("Verdana", 14), new SolidBrush(System.Drawing.Color.Black), 20,20); 
} 

Как говорит TaW, вы не можете получить доступ к локальным переменным другого метода, так что вы sould определить метод, верните переменную (ы) и вызовите ее внутри pd_PrintPage.

EDIT (обновленный код)

Ваш код, кажется, только математические Scoped, но и вычислить и печать уволят отдельно от двух различных кнопок.

Таким образом, принцип обеспечивается TAW прав в этом случае:

private double jj1, jj2; 

private void btn_calculate_Click(object sender, RoutedEventArgs e) 
{ 
    double jj1 = // code removed for clarity 
    double jj2 = // code removed for clarity 

    this.jj1 = jj1; 
    this.jj2 = jj2; 
} 

Затем в pd_PrintPage метод:

private void pd_PrintPage(object sender, PrintPageEventArgs e) 
{    
    String drawString = this.jj1.ToString(); 
    String drawString2 = this.jj2.ToString(); 

    // now draw with graphics 
} 

Надеется, что это помогает!

+0

Это один из вариантов, но для дюжины чисел, таких как суммы и т. Д. Я не думаю, что один метод за номер - хороший дизайн. Класс или даже структура 'printData' были бы лучше. Но, не зная больше, мы не можем полностью консультировать. – TaW

+0

Да, я согласен, но мой ответ указывает, как получить доступ к объекту, определенному как локальный, другим способом, не сохраняя его до уровня класса. Код примера OP показывает, что ему нужна строка, поэтому мой пример выставляет метод String. –

+0

В моем случае у меня есть две переменные: jj1 и jj2, и они оба удваиваются. Я определил их в методе кнопки калькуляции, и это то, где выполняется расчет. Результат приведен в метке. Я хочу распечатать содержимое, если оба jj1 и jj2. Должен ли я сделать новый метод, где выполняется расчет, и вызвать метод как в кнопке расчета, так и в кнопке печати? Может быть, это лучший дизайн? –

Смежные вопросы