Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: Базы данных, ADO.NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/29: Рейтинг темы: голосов - 29, средняя оценка - 4.83
frech
34 / 34 / 3
Регистрация: 17.07.2008
Сообщений: 580
1

Как вывести данные из БД на печать, используя компонент DGV

13.01.2012, 21:58. Просмотров 5281. Ответов 11
Метки нет (Все метки)

всем привет. В моем приложении имеется БД, работа с БД. Хочется напечатать их. Конкретно сказать, напечатать данные для каждого сотрудника. Я буду кликать в DataGrid View на каждого пользователя, а потом печатать их. Как мне послать эти данные на печать?
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.01.2012, 21:58
Ответы с готовыми решениями:

Вывести DGV на печать
Подскажите как вывести на печать через кнопку мою DGV?

Как отправить данные находящиеся в компоненте RichEdit на печать через компонент TPrintDialog?
У меня в меню есть кнопка Печать. На форме есть компоненты TRichEdit, TPrintDialog. Как отправить...

Как вывести на печать данные из Memo1?
Есть поле Memo1 с данными как их вывести на печать, какой элемент нужно использовать???

Как вывести данные на печать принтера.
Здравствуйте ! Помогите новичку. Есть форма (создал визардом), убрал кнопки (OK и Cancel ),...

Как передать данные из одной dgv одной формы в dgv другой?
Проблема номер 2 Моя программа работает с базой данных, записывает, удаляет и считывает данные...

11
iliabest
16 / 16 / 3
Регистрация: 16.08.2011
Сообщений: 62
13.01.2012, 22:03 2
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
PrintDocument prndoc;
    PageSetupDialog setdlg;
    PrintPreviewDialog predlg;
    PrintDialog prndlg;
        
        Form1 ()
      {
      prndoc = new PrintDocument ();
      setdlg = new PageSetupDialog ();
      predlg = new PrintPreviewDialog ();
      prndlg = new PrintDialog ();
 
      prndoc.PrintPage += new PrintPageEventHandler (OnPrintPage);
      prndoc.QueryPageSettings += new QueryPageSettingsEventHandler(OnQueryPageSettings);
      prndoc.BeginPrint += new PrintEventHandler (OnBeginPrint);
      setdlg.Document = prndoc;
      predlg.Document = prndoc;
      prndlg.Document = prndoc;
      prndlg.AllowSomePages = true;
      prndlg.PrinterSettings.FromPage = 1;
      prndlg.PrinterSettings.ToPage = prndlg.PrinterSettings.MaximumPage;
      }
            
    void OnQueryPageSettings (object sender, QueryPageSettingsEventArgs e)
    {
      e.PageSettings.Landscape = true;
    }
    public void OnBeginPrint (object sender, PrintEventArgs args)
    {
    }
    void OnPrintPage (object sender, PrintPageEventArgs e)
    {
          //рисуем изображение
            //если надо вывести еще страницу
            e.HasMorePages = true;
    }
        
        //вызов окна предварительного просмотра
        predlg.ShowDialog ();
        //печатать
        prndoc.Print ();
0
frech
34 / 34 / 3
Регистрация: 17.07.2008
Сообщений: 580
13.01.2012, 22:40  [ТС] 3
и как это связать с базой данных?
0
CBOJlO4
11 / 11 / 3
Регистрация: 26.11.2010
Сообщений: 147
16.01.2012, 15:27 4
Тоже интересует вопрос! Помогите! Тему up
0
16.01.2012, 15:27
iliabest
16 / 16 / 3
Регистрация: 16.08.2011
Сообщений: 62
16.01.2012, 19:41 5
Печатать будет картинку.. насколько мне известно принтера печатают только RGB и SYNC.. Короче это не важно, если нужно именно текст то придется выводит этот текст

C#
1
2
3
4
void OnPrintPage (object sender, PrintPageEventArgs e)
{
      e.Graphics.DrawString("String", new Font("Microsoft Sans Serif", 8), Brushes.Black, 100, 50);
}
0
frech
34 / 34 / 3
Регистрация: 17.07.2008
Сообщений: 580
17.01.2012, 16:52  [ТС] 6
и как туда вообще вставляются данные из БД?
0
CBOJlO4
11 / 11 / 3
Регистрация: 26.11.2010
Сообщений: 147
18.01.2012, 11:17 7
Цитата Сообщение от frech Посмотреть сообщение
и как туда вообще вставляются данные из БД?

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
ArrayList all = new ArrayList(); // массив данных
            using (SqlConnection con = new SqlConnection(connectionString)) // юсинг после окончания закрывает соединение
            {
 
                try
                {
                    string query = String.Format("SELECT * FROM ТВОЯБаЗА WHERE {0} LIKE '{1}'", строка1,строка2);
 
                    SqlCommand com = new SqlCommand(query, con);
                    try
                    {
                        con.Open();
                        SqlDataReader dr = com.ExecuteReader(); // посылает текст по соединению "con" и создает поток чтения
                        if (dr.HasRows)
                        {
                            foreach (DbDataRecord result in dr)
                                all.Add(result); //кидаем в массив данных то что вытянули
                        }
                        else
                            MessageBox.Show("Нечего не найденно.", MessageBoxButtons.OK);
                    }
                    catch
                    {
                    }
                }
                catch
                {
                    MessageBox.Show("не правильно сформирован запрос ", "c3vision Error", MessageBoxButtons.OK);
                }
//и самая главная строка
dgv_Main.DataSource = all; //заносим в датагридвиев
0
frech
34 / 34 / 3
Регистрация: 17.07.2008
Сообщений: 580
19.01.2012, 12:00  [ТС] 8
Цитата Сообщение от CBOJlO4 Посмотреть сообщение
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
ArrayList all = new ArrayList(); // массив данных
            using (SqlConnection con = new SqlConnection(connectionString)) // юсинг после окончания закрывает соединение
            {
 
                try
                {
                    string query = String.Format("SELECT * FROM ТВОЯБаЗА WHERE {0} LIKE '{1}'", строка1,строка2);
 
                    SqlCommand com = new SqlCommand(query, con);
                    try
                    {
                        con.Open();
                        SqlDataReader dr = com.ExecuteReader(); // посылает текст по соединению "con" и создает поток чтения
                        if (dr.HasRows)
                        {
                            foreach (DbDataRecord result in dr)
                                all.Add(result); //кидаем в массив данных то что вытянули
                        }
                        else
                            MessageBox.Show("Нечего не найденно.", MessageBoxButtons.OK);
                    }
                    catch
                    {
                    }
                }
                catch
                {
                    MessageBox.Show("не правильно сформирован запрос ", "c3vision Error", MessageBoxButtons.OK);
                }
//и самая главная строка
dgv_Main.DataSource = all; //заносим в датагридвиев
да получение данных из БД я знаю. Мне интересно, как послать это на печать? В предудушим коде было показано, но не сказано куда вставляются данные. По подробнее можна?
0
Петррр
6191 / 3492 / 899
Регистрация: 28.10.2010
Сообщений: 5,928
19.01.2012, 17:41 9
Конкатенацию двух кодов выполнить слабо?

http://www.codeproject.com/KB/grid/GridDrawer.Net.aspx

Добавлено через 52 минуты
Ну очень простой пример
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
using System;
using System.Data;
using System.Drawing.Printing;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
 
 
public class DgvPrint : Form
{
    public DgvPrint()
    {
        Button button = new Button
        {
            Text = "Print",
            Left = 10,
            Top = 10
        };
        button.Click += (s, e) =>
        {
            PrintDocument printDocument = new PrintDocument();
            printDocument.PrintPage += new PrintPageEventHandler(printDocument_PrintPage);
            printDocument.Print();
        };
        this.Controls.Add(button);
        this.DataGrid = new DataGridView
        {
            Left = 10,
            Top = button.Bottom + 10,
            Width = this.ClientRectangle.Width - 20,
            Height = this.ClientRectangle.Height - 30 - button.Height,
            Anchor = AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top
        };
        this.Controls.Add(this.DataGrid);
        this.DataGrid.Columns.Add("famaly", "Фамилия");
        this.DataGrid.Columns.Add("name", "Имя");
        string[,] persons = new string[,] {
            {"Иванов", "Иван"},
            {"Петров", "Петр"},
            {"Сидоров", "Сидр"}
        };
        for (int i = 0; i < persons.GetLength(0); i++)
            this.DataGrid.Rows.Add(persons[i, 0], persons[i, 1]);
        this.DataGrid.AllowUserToAddRows = false;
    }
 
    public DataGridView DataGrid
    {
        get;
        set;
    }
 
    void printDocument_PrintPage(object sender, PrintPageEventArgs e)
    {
        string header = "Печатный документ";
        e.Graphics.DrawString(header, new Font("Arial", 16), Brushes.Black, new PointF(
                (e.PageBounds.Width - e.Graphics.MeasureString(header, new Font("Arial", 16)).Width) / 2,
                20
            ));
        Font font = new Font("Times New Roman", 14);
        int left = 60;
        int top = 60;
        for (int i = 0; i < this.DataGrid.Rows.Count; i++)
        {
            e.Graphics.DrawRectangle(new Pen(Color.Black, 1), new Rectangle(left, top + 40 * i, 150, 40));
            e.Graphics.DrawString(this.DataGrid[0, i].Value.ToString(), font, Brushes.Black, new PointF(left + 7, top + 40 * i + 5f));
            e.Graphics.DrawRectangle(new Pen(Color.Black, 1), new Rectangle(left + 150, top + 40 * i, 150, 40));
            e.Graphics.DrawString(this.DataGrid[1, i].Value.ToString(), font, Brushes.Black, new PointF(left + 7 + 150, top + 40 * i + 5f));
        }
    }
    public static void Main()
    {
        Application.EnableVisualStyles();
        Application.Run(new DgvPrint());
    }
}
0
frech
34 / 34 / 3
Регистрация: 17.07.2008
Сообщений: 580
29.01.2012, 10:57  [ТС] 10
воспользовался примерам который вы дали и теми классами. Но там в одном классе показывает ошибки, не могу ее исправить. Вот сама ошибка
Как вывести данные из БД на печать, используя компонент DGV


а вот и сам код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.Drawing;
 
 
namespace Printing.DataGridViewPrint
{
 
    public enum CodeEnum
    {
        SheetNumber,
        SheetsCount,
        Date,
        Time
    }
 
    /// <author>Blaise Braye</author>
    /// <summary>
    /// GridDraw is a DataGridView Printing tool which try to help developper to print quickly and efficiently datas from grids
    /// </summary>
    public class GridDrawer
    {
        #region Fields
 
        static readonly Exception NotSynException = new Exception("Drawer is not synchronised with datagridview");
 
        private DataGridView _GridView;
 
        DocumentMetrics metrics;
 
        float scale;
 
        float columnHeaderHeight;
        float[] rowsHeights;
        float[] columnWidths;
 
        int[] firstRows;
        int[] firstColumns;
 
        Func<DataGridViewRow, bool> rowSelector;
        Func<DataGridViewColumn, bool> colSelector;
 
        Dictionary<int, IEnumerable<Partition>> levels;
 
        Dictionary<CodeEnum, string> codes;
 
        #endregion
 
 
        #region Properties
 
        /// <summary>
        /// This is the grid that the Drawer will print
        /// </summary>
        public DataGridView GridView
        {
            get { return _GridView; }
            set
            {
                if (value == null)
                    throw new Exception("GridView must not be null");
                IsInitialized = false;
                this._GridView = value;
            }
        }
 
 
        /// <summary>
        /// used by Drawer to know if it has been initialized
        /// </summary>
        bool IsInitialized { get; set; }
 
        /// <summary>
        /// Define if you want to center grid on sheet?
        /// </summary>
        public bool MustCenterPartition { get; set; }
 
        /// <summary>
        /// Define if you want to ensure that grid won't be larger than printed sheet
        /// </summary>
        public bool MustFitColumnsToPage { get; set; }
 
        /// <summary>
        /// Define if you want to print level by level or not (partions columns by partitions columns)
        /// Default value: true
        /// </summary>
        public bool MustPrintLevelByLevel { get; set; }
 
        /// <summary>
        /// Define if you want to print selected columns only
        /// </summary>
        public bool MustPrintSelectedColumns { get; set; }
 
        /// <summary>
        /// Define if you want to print selected rows only
        /// </summary>
        public bool MustPrintSelectedRows { get; set; }
 
 
        /// <summary>
        /// Define a title block which appears on first sheet only, above the grid
        /// </summary>
        public PrintBlock TitlePrintBlock { get; set; }
 
        /// <summary>
        /// Define a footer which appears on each sheet
        /// </summary>
        public PrintBlock SheetFooter { get; set; }
 
        /// <summary>
        /// Define a header which appears on each sheet
        /// </summary>
        public PrintBlock SheetHeader { get; set; }
 
 
        /// <summary>
        /// /// Once Drawer has been initialized, return the number of levels to print
        /// </summary>
        public int LevelsCount
        {
            get { return firstRows.Length; }
        }
 
        /// <summary>
        /// /// Once Drawer has been initialized, return the number of partitions of one level
        /// </summary>
        public int PartitionsCount
        {
            get { return firstRows.Length; }
        }
 
        /// <summary>
        /// Once Drawer has been initialized, return the number of page to print
        /// </summary>
        public int SheetsCount
        {
            get { return LevelsCount * firstColumns.Length; }
        }
                
 
 
        #endregion
 
        #region Constructors
 
        /// <param name="dgv">GridView to manage</param>
        public GridDrawer(DataGridView dgv)
        {
            this.GridView = dgv;
            MustPrintLevelByLevel = true;
        }
 
        /// <param name="dgv">GridView to manage</param>
        /// <param name="mustCenterPartition">Do you want to center grid on sheet?</param>
        public GridDrawer(DataGridView dgv, bool mustCenterPartition)
            : this(dgv)
        {
            this.MustCenterPartition = mustCenterPartition;
        }
 
 
        /// <param name="dgv">GridView to manage</param>
        /// <param name="mustCenterPartition">Do you want to center grid on sheet?</param>
        /// <param name="mustFitColumnsToPage">Do you want to ensure that grid won't be larger than printed sheet</param>
        public GridDrawer(DataGridView dgv, bool mustCenterPartition, bool mustFitColumnsToPage)
            : this(dgv, mustCenterPartition)
        {
            this.MustFitColumnsToPage = mustFitColumnsToPage;
        }
 
 
        #endregion
 
        /// <summary>
        /// Make first calculations to know exactly what we can print on each sheet
        /// </summary>
        /// <param name="g"></param>
        /// <param name="metrics"></param>
        public void Initialize(Graphics g, DocumentMetrics metrics)
        {
            this.metrics = metrics;
 
            #region Take care of set blocks
 
            if (SheetHeader != null)
            {
                float headerHeight = SheetHeader.GetSize(g, metrics).Height;
 
                SheetHeader.Rectangle =
                    new RectangleF(metrics.LeftMargin, metrics.TopMargin, metrics.PrintAbleWidth, headerHeight);
 
                metrics.TopMargin += (int)Math.Ceiling(headerHeight);
            }
 
            if (TitlePrintBlock != null)
            {
                float titleHeight = TitlePrintBlock.GetSize(g, metrics).Height;
 
                TitlePrintBlock.Rectangle =
                    new RectangleF(metrics.LeftMargin, metrics.TopMargin, metrics.PrintAbleWidth, titleHeight);
            }
 
            if (SheetFooter != null)
            {
                float footerHeight = SheetFooter.GetSize(g, metrics).Height;
 
                metrics.BottomMargin += (int)Math.Ceiling(footerHeight);
                float footerY = metrics.TopMargin + metrics.PrintAbleHeight;
 
                SheetFooter.Rectangle =
                    new RectangleF(metrics.LeftMargin, footerY, metrics.PrintAbleWidth, footerHeight);
            }
 
 
            #endregion
 
 
            columnWidths = new float[GridView.Columns.Count];
 
 
            colSelector =
                new Func<DataGridViewColumn, bool>(column =>
                    (MustPrintSelectedColumns && column.DataGridView.SelectedColumns.Count > 0)
                    ? column.Selected
                    : column.Visible);
 
 
            float gridWidth = 0; 
            // calculate the grid width to know the difference with a sheet width,
            // it's usefull to determinate a scale
            foreach (var column in GridView.Columns.OfType<DataGridViewColumn>()
                .Where(colSelector))
            {
                columnWidths[column.Index] = column.Width(g);
                gridWidth += columnWidths[column.Index];
            }
 
            // we fix the scale to 1 if user doesn't need to zoom out the grid or if
            // the gridwidth is lower thant sheet width
            scale = (!MustFitColumnsToPage || gridWidth < metrics.PrintAbleWidth)
                ? 1 : metrics.PrintAbleWidth / gridWidth;
 
 
            columnHeaderHeight = GridView.HeaderHeight(g,scale);
 
 
            // let's go to set the partition splits
            List<int> firstColumnsOnPartition = new List<int>();
 
            float tmpWidth = 0;
            foreach (var column in GridView.Columns.OfType<DataGridViewColumn>()
                .Where(colSelector))
            {
                columnWidths[column.Index] *= scale;
 
                tmpWidth += columnWidths[column.Index];
 
                if (tmpWidth > metrics.PrintAbleWidth || column.Index == 0)
                {
                    firstColumnsOnPartition.Insert(0, column.Index);
                    tmpWidth = columnWidths[column.Index];
                }
            }
            firstColumnsOnPartition.Reverse();
 
 
            // let's go to set the level splits
 
            rowSelector =
                new Func<DataGridViewRow, bool>(row => 
                    (MustPrintSelectedRows && row.DataGridView.SelectedRows.Count>0) 
                    ? row.Selected 
                    : row.Visible);
            
            rowsHeights = new float[GridView.Rows.Count];
            List<int> firstRowsOnPartition = new List<int>();
 
            
            
            // we have to set the first visible row outside of the loop
            // cause we want to take care about the possible set Title block
            int firstVisibleRowIndex = GridView.Rows.OfType<DataGridViewRow>()
                    .Where(rowSelector).First().Index;
            firstRowsOnPartition.Insert(0, firstVisibleRowIndex);
            rowsHeights[firstVisibleRowIndex] = GridView.Rows[firstVisibleRowIndex].RowHeight(g);
            
            float tmpHeight = rowsHeights[firstVisibleRowIndex];
 
            if (TitlePrintBlock != null)
                tmpHeight += TitlePrintBlock.Rectangle.Height;
 
            // skip the first visible row cause it is already in firstrows (see above)
            foreach (var row in GridView.Rows.OfType<DataGridViewRow>()
                                    .Where(rowSelector).Skip(1)) 
            {
                rowsHeights[row.Index] = row.RowHeight(g,scale);
                tmpHeight += rowsHeights[row.Index];
 
                // warn to take care about the column headers
                if (tmpHeight >= metrics.PrintAbleHeight - columnHeaderHeight)
                {
                    firstRowsOnPartition.Insert(0, row.Index);
                    tmpHeight = rowsHeights[row.Index];
                }
            }
            firstRowsOnPartition.Reverse();
 
            // now that it is calculated, we can fix definitely firstRows and firstColumns in arrays
            firstRows = firstRowsOnPartition.ToArray();
            firstColumns = firstColumnsOnPartition.ToArray();
 
            
            levels = new Dictionary<int, IEnumerable<Partition>>(firstRows.Length);
 
            codes = new Dictionary<CodeEnum, string>();
            codes[CodeEnum.SheetsCount] = SheetsCount.ToString();
            codes[CodeEnum.Date] = DateTime.Now.ToShortDateString();
            codes[CodeEnum.Time] = DateTime.Now.ToShortTimeString();
 
            IsInitialized = true;
            
        }
 
 
        /// <summary>
        /// Get each partitions to print, take care of the MustPrintLevelByLevel property value
        /// </summary>
        /// <returns></returns>
        public IEnumerable<Partition> Partitions()
        {
            for (int levelIndex = 1; levelIndex <= firstRows.Length; levelIndex++)
                foreach (var partition in (MustPrintLevelByLevel)?PartitionsByLevel(levelIndex):PartitionsByColumn(levelIndex))
                    yield return partition;
        }
 
 
        
 
 
        /// <summary>
        /// Get partitions of one printable level
        /// </summary>
        /// <param name="indexLevel">level from which user needs partitions</param>
        /// <returns></returns>
        public IEnumerable<Partition> PartitionsByLevel(int indexLevel)
        {
            if (!IsInitialized) throw NotSynException;
 
            int firstRow = firstRows[indexLevel - 1];
            int lastRow = (indexLevel >= firstRows.Length) ?
                                rowsHeights.Length - 1 // last dgv row index
                                : firstRows[indexLevel] - 1;
 
            float height = rowsHeights.Skip(firstRow).Take(lastRow + 1 - firstRow).Sum();
 
 
            // initialization of each partition of the current level [indexLevel]
            for (int partitionLevel = 0; partitionLevel < firstColumns.Length; partitionLevel++)
            {
                int firstColumn = firstColumns[partitionLevel];
                int lastColumn = (partitionLevel + 1 == firstColumns.Length) ?
                                    columnWidths.Length - 1 // last dgv column index
                                    : firstColumns[partitionLevel + 1] - 1; // next first column - 1
 
                float width = columnWidths.Skip(firstColumn).Take(lastColumn + 1 - firstColumn).Sum();
 
                int pageNumber = ((indexLevel - 1) * PartitionsCount + partitionLevel) + 1;
 
                yield return CreatePartition(
                    indexLevel, partitionLevel, pageNumber,
                    firstRow, lastRow, firstColumn, lastColumn, 
                    metrics.LeftMargin, metrics.TopMargin, width, height);
 
            }
        }
 
        /// <summary>
        /// Get [partitionLevel]th partitions of each levels
        /// </summary>
        /// <param name="partitionLevel">[partitionLevel]th partitions of each levels</param>
        /// <returns></returns>
        public IEnumerable<Partition> PartitionsByColumn(int partitionLevel)
        {
            if (!IsInitialized) throw NotSynException;
 
            int firstColumn = firstColumns[partitionLevel-1];
            int lastColumn = (partitionLevel == firstColumns.Length) ?
                                columnWidths.Length - 1 // last dgv column index
                                : firstColumns[partitionLevel] - 1; // next first column - 1
 
            float width = columnWidths.Skip(firstColumn).Take(lastColumn + 1 - firstColumn).Sum();
 
            for (int indexLevel = 0; indexLevel < firstRows.Length; indexLevel++)
            {
                int firstRow = firstRows[indexLevel];
                int lastRow = (indexLevel + 1 == firstRows.Length) ?
                                    rowsHeights.Length - 1 // last dgv row index
                                    : firstRows[indexLevel + 1] - 1;
 
                float height = rowsHeights.Skip(firstRow).Take(lastRow + 1 - firstRow).Sum();
 
                int pageNumber = ((partitionLevel - 1) * LevelsCount + indexLevel) + 1;
 
                yield return CreatePartition(
                    indexLevel, partitionLevel, pageNumber,
                    firstRow, lastRow, firstColumn, lastColumn,
                    metrics.LeftMargin, metrics.TopMargin, width, height);
 
            }
 
        }
 
 
        Partition CreatePartition(
            int indexLevel, int partitionLevel, int pageNumber, 
            int firstRow, int lastRow, int firstColumn,  int lastColumn,
            float startx, float starty, float width, float height)
        {
 
            if (MustCenterPartition)
                startx += (metrics.PrintAbleWidth - width) / 2.0F;
 
            PartitionBounds bounds = new PartitionBounds()
            {
                ColSelector = colSelector,
                RowSelector = rowSelector,
                StartRowIndex = firstRow,
                EndRowIndex = lastRow,
                StartColumnIndex = firstColumn,
                EndColumnIndex = lastColumn,
                StartX = startx,
                StartY = starty,
                Width = width,
                Height = height
            };
 
            if (indexLevel == 1 && TitlePrintBlock != null)
                bounds.StartY += TitlePrintBlock.Rectangle.Height;
 
 
 
            return new Partition(
                    GridView,
                    pageNumber,
                    bounds);
        }
 
 
        /// <summary>
        /// Print a sheet containing the given partition
        /// </summary>
        /// <param name="g"></param>
        /// <param name="partition"></param>
        public void DrawSheet(Graphics g, Partition partition)
        {
            codes[CodeEnum.SheetNumber] = partition.SheetNumber.ToString();
 
            if (SheetHeader != null) // print header if it has been set
                SheetHeader.Draw(g, codes);
 
            // print report title on first page if a title block has been set
            if (partition.SheetNumber == 1 && TitlePrintBlock != null)
                TitlePrintBlock.Draw(g, codes);
 
            float currentY = DrawColumnHeaders(g, partition);
            DrawRows(g, partition, currentY);
 
            if (SheetFooter != null) // print footer if it has been set
                SheetFooter.Draw(g, codes);
 
        }
  
 
        /// <summary>
        /// Draw Grid column headers from partition
        /// </summary>
        /// <param name="g"></param>
        /// <param name="partition">Partition to print</param>
        /// <returns></returns>
        private float DrawColumnHeaders(Graphics g, Partition partition)
        {
            PartitionBounds bounds = partition.Bounds;
 
            float currentY = bounds.StartY;
            float currentX = bounds.StartX;
 
 
 
            // Setting the LinePen that will be used to draw lines and rectangles (derived from the GridColor property of the DataGridView control)
            Pen linePen = new Pen(GridView.GridColor, 1);
 
            // Calculating and drawing the HeaderBounds        
            RectangleF HeaderBounds = new RectangleF(currentX, currentY, bounds.Width, columnHeaderHeight);
 
            g.FillRectangle(
                new SolidBrush(GridView.ColumnsHeaderBackColor()),
                HeaderBounds);
 
 
            // Setting the format that will be used to print each cell of the header row
            StringFormat CellFormat = new StringFormat();
            CellFormat.Trimming = StringTrimming.Word;
            CellFormat.FormatFlags = StringFormatFlags.LineLimit | StringFormatFlags.NoClip;
 
 
 
            // Printing each visible cell of the header row
            foreach (var column in partition.GetColumns())
            {
                DataGridViewHeaderCell cell = column.HeaderCell;
 
                CellFormat.Alignment = cell.HorizontalAlignement();
 
 
                RectangleF CellBounds = new RectangleF(currentX, currentY, columnWidths[column.Index], columnHeaderHeight);
 
                // Printing the cell text
                g.DrawString(column.HeaderText,
                    cell.Font(scale),
                    new SolidBrush(cell.ForeColor()),
                    CellBounds, 
                    CellFormat);
 
 
                // Drawing the cell bounds
                if (GridView.RowHeadersBorderStyle != DataGridViewHeaderBorderStyle.None) // Draw the cell border only if the HeaderBorderStyle is not None
                    g.DrawRectangle(linePen, currentX, currentY, columnWidths[column.Index], columnHeaderHeight);
 
 
                currentX += columnWidths[column.Index];
 
            }
 
            return currentY + columnHeaderHeight;
        }
 
 
        /// <summary>
        /// Draw Grid rows from given partition
        /// </summary>
        /// <param name="g"></param>
        /// <param name="partition">Partition to print</param>
        /// <param name="currentY">Starting Y coordinate</param>
        private void DrawRows(Graphics g, Partition partition, float currentY)
        {
            PartitionBounds bounds = partition.Bounds;
 
            // Setting the LinePen that will be used to draw lines and rectangles
            Pen linePen = new Pen(GridView.GridColor, 1);
 
            // Setting the format that will be used to print each cell
            StringFormat CellFormat = new StringFormat();
            CellFormat.Trimming = StringTrimming.Word;
            CellFormat.FormatFlags = StringFormatFlags.LineLimit;
 
 
            foreach (var row in partition.GetRows())
            {
                float rowHeight = rowsHeights[row.Index];
 
 
                // Setting the RowFore style
                SolidBrush RowForeBrush = new SolidBrush(row.ForeColor());
 
 
                // Calculating the starting x coordinate that the printing process will start from
                float currentX = bounds.StartX;
 
 
 
                // Calculating the entire CurrentRow bounds                
                RectangleF RowBounds = new RectangleF(currentX, currentY, bounds.Width, rowHeight);
 
                g.FillRectangle(new SolidBrush(row.BackColor()), RowBounds);
 
                foreach (var column in partition.GetColumns())
                {
                    var cell = row.Cells[column.Index];
 
                    CellFormat.Alignment = cell.HorizontalAlignement();
 
                    RectangleF CellBounds = new RectangleF(currentX, currentY, columnWidths[column.Index], rowHeight);
 
                    // Printing the cell text
                    g.DrawString(
                        cell.EditedFormattedValue.ToString(),
                        cell.Font(scale),
                        new SolidBrush(row.ForeColor()),
                        CellBounds,
                        CellFormat);
 
                    // Drawing the cell bounds
                    if (GridView.CellBorderStyle != DataGridViewCellBorderStyle.None) // Draw the cell border only if the CellBorderStyle is not None
                        g.DrawRectangle(linePen, currentX, currentY, columnWidths[column.Index], rowHeight);
 
                    currentX += columnWidths[column.Index];
                }
 
                currentY += rowHeight;
            }
        }
 
    }
}
0
frech
34 / 34 / 3
Регистрация: 17.07.2008
Сообщений: 580
29.01.2012, 13:17  [ТС] 11
воспользовался вашим советам и напечатал данные как картинку:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
private void button1_Click_1(object sender, EventArgs e)
        {
            if (printDialog.ShowDialog() == DialogResult.OK)
            {
 
                printDocument.Print();
            }
        }
 
        private void printDocument_PrintPage(object sender, PrintPageEventArgs e)
        {
            Bitmap bmp = new Bitmap(this.dgv_Date.Width, this.dgv_Date.Height);
 
            this.dgv_Date.DrawToBitmap( bmp, new Rectangle (0,0,this.dgv_Date.Width, this.dgv_Date.Height ));
 
            e.Graphics.DrawImage(bmp,0,0);
 
            bmp.Save("C:\\Documents and Settings\\Admin\\Рабочий стол\\fotoprint.bmp");
        }
но тут печатает и сохраняет толька видимую часть, а мне нужно вся часть. Как сохранить все данные DataGridView в картинке и послать на печать?
0
Learx
1048 / 855 / 194
Регистрация: 31.03.2010
Сообщений: 2,506
31.01.2012, 11:46 12
Вот Хороший рабочий прмер, там же есть пример по извлечению данных из БД.

Вот еще несколько ссылок которые тебе помогут:

Работа с подключенным уровнем ADO .NET в C#

FAQ по ADO.NET

http://msdn.microsoft.com/ru-ru/libr...atasource.aspx

http://msdn.microsoft.com/ru-ru/libr...vs.100%29.aspx

На будущее: сначала читай мсдн и факю на форуме
0
Вложения
Тип файла: zip PrintDataGridView.zip (99.2 Кб, 194 просмотров)
31.01.2012, 11:46
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.01.2012, 11:46

произвести вычисление значений функций. Результаты вычислений вывести в компонент ListBox. Выбор вычисляемой функции производить, используя компонент RadioButton.
Для ЛП произвести вычисление значений функций. Результаты вычислений вывести в компонент ListBox....

Как вывести данные с таблицы на печать в делфи?
Как вывести данные с таблицы на печать в делфи?

Как вывести на печать данные из таблицы из lua-файла?
Создал &quot;t.lua&quot;. файл содержит: require(&quot;data&quot;); print(tostring(arr)) data.lua содержит:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.