Print alternating rows in color din DataGridView VB.Net









up vote
1
down vote

favorite












I fill a DatagridView with data, then I want to print this data in alternating colors, but when I do my PrintPreview I only see my columns show alternating colors.



Pic
Here is what I am trying;



Private Sub PrintDocument1_PrintPage(sender As System.Object, e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
With DataGridView1
Dim fmt As StringFormat = New StringFormat(StringFormatFlags.LineLimit)
fmt.LineAlignment = StringAlignment.Center
fmt.Trimming = StringTrimming.EllipsisCharacter
Dim y As Single = e.MarginBounds.Top - 50
Dim myBrush As Brush
Dim myBrush1 As Brush
Dim rowID As Integer = 0

myBrush = New SolidBrush(Color.AliceBlue)
myBrush1 = New SolidBrush(Color.White)
Do While mRow < .RowCount
Dim row As DataGridViewRow = .Rows(mRow)
Dim x As Single = e.MarginBounds.Left - 65
Dim h As Single = 0
For Each cell As DataGridViewCell In row.Cells
Dim rc As RectangleF = New RectangleF(x, y, cell.Size.Width, cell.Size.Height)

e.Graphics.DrawRectangle(Pens.Black, rc.Left, rc.Top, rc.Width, rc.Height)
If (newpage) Then
'e.Graphics.FillRectangle(myBrush, rc)
e.Graphics.DrawString(DataGridView1.Columns(cell.ColumnIndex).HeaderText, .Font, Brushes.Black, rc, fmt)
Else
If rowID = 0 Then
e.Graphics.FillRectangle(myBrush, rc)
rowID = 1
ElseIf rowID = 1 Then
e.Graphics.FillRectangle(myBrush1, rc)
rowID = 0
End If
e.Graphics.DrawString(DataGridView1.Rows(cell.RowIndex).Cells(cell.ColumnIndex).FormattedValue.ToString(), .Font, Brushes.Black, rc, fmt)
End If
x += rc.Width
h = Math.Max(h, rc.Height)

Next
newpage = False
y += h
mRow += 1

If y + h > e.MarginBounds.Bottom Then
e.HasMorePages = True
mRow -= 1
newpage = True
Exit Sub
End If
Loop
mRow = 0
End With
End Sub


I have tried to place the



If rowID = 0 Then
e.Graphics.FillRectangle(myBrush, rc)
rowID = 1
ElseIf rowID = 1 Then
e.Graphics.FillRectangle(myBrush1, rc)
rowID = 0
End If


in other places, but I get the same results. This use to be easy in ASP.Net, but now I am working in VB.Net. Any ideas?










share|improve this question



























    up vote
    1
    down vote

    favorite












    I fill a DatagridView with data, then I want to print this data in alternating colors, but when I do my PrintPreview I only see my columns show alternating colors.



    Pic
    Here is what I am trying;



    Private Sub PrintDocument1_PrintPage(sender As System.Object, e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
    With DataGridView1
    Dim fmt As StringFormat = New StringFormat(StringFormatFlags.LineLimit)
    fmt.LineAlignment = StringAlignment.Center
    fmt.Trimming = StringTrimming.EllipsisCharacter
    Dim y As Single = e.MarginBounds.Top - 50
    Dim myBrush As Brush
    Dim myBrush1 As Brush
    Dim rowID As Integer = 0

    myBrush = New SolidBrush(Color.AliceBlue)
    myBrush1 = New SolidBrush(Color.White)
    Do While mRow < .RowCount
    Dim row As DataGridViewRow = .Rows(mRow)
    Dim x As Single = e.MarginBounds.Left - 65
    Dim h As Single = 0
    For Each cell As DataGridViewCell In row.Cells
    Dim rc As RectangleF = New RectangleF(x, y, cell.Size.Width, cell.Size.Height)

    e.Graphics.DrawRectangle(Pens.Black, rc.Left, rc.Top, rc.Width, rc.Height)
    If (newpage) Then
    'e.Graphics.FillRectangle(myBrush, rc)
    e.Graphics.DrawString(DataGridView1.Columns(cell.ColumnIndex).HeaderText, .Font, Brushes.Black, rc, fmt)
    Else
    If rowID = 0 Then
    e.Graphics.FillRectangle(myBrush, rc)
    rowID = 1
    ElseIf rowID = 1 Then
    e.Graphics.FillRectangle(myBrush1, rc)
    rowID = 0
    End If
    e.Graphics.DrawString(DataGridView1.Rows(cell.RowIndex).Cells(cell.ColumnIndex).FormattedValue.ToString(), .Font, Brushes.Black, rc, fmt)
    End If
    x += rc.Width
    h = Math.Max(h, rc.Height)

    Next
    newpage = False
    y += h
    mRow += 1

    If y + h > e.MarginBounds.Bottom Then
    e.HasMorePages = True
    mRow -= 1
    newpage = True
    Exit Sub
    End If
    Loop
    mRow = 0
    End With
    End Sub


    I have tried to place the



    If rowID = 0 Then
    e.Graphics.FillRectangle(myBrush, rc)
    rowID = 1
    ElseIf rowID = 1 Then
    e.Graphics.FillRectangle(myBrush1, rc)
    rowID = 0
    End If


    in other places, but I get the same results. This use to be easy in ASP.Net, but now I am working in VB.Net. Any ideas?










    share|improve this question

























      up vote
      1
      down vote

      favorite









      up vote
      1
      down vote

      favorite











      I fill a DatagridView with data, then I want to print this data in alternating colors, but when I do my PrintPreview I only see my columns show alternating colors.



      Pic
      Here is what I am trying;



      Private Sub PrintDocument1_PrintPage(sender As System.Object, e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
      With DataGridView1
      Dim fmt As StringFormat = New StringFormat(StringFormatFlags.LineLimit)
      fmt.LineAlignment = StringAlignment.Center
      fmt.Trimming = StringTrimming.EllipsisCharacter
      Dim y As Single = e.MarginBounds.Top - 50
      Dim myBrush As Brush
      Dim myBrush1 As Brush
      Dim rowID As Integer = 0

      myBrush = New SolidBrush(Color.AliceBlue)
      myBrush1 = New SolidBrush(Color.White)
      Do While mRow < .RowCount
      Dim row As DataGridViewRow = .Rows(mRow)
      Dim x As Single = e.MarginBounds.Left - 65
      Dim h As Single = 0
      For Each cell As DataGridViewCell In row.Cells
      Dim rc As RectangleF = New RectangleF(x, y, cell.Size.Width, cell.Size.Height)

      e.Graphics.DrawRectangle(Pens.Black, rc.Left, rc.Top, rc.Width, rc.Height)
      If (newpage) Then
      'e.Graphics.FillRectangle(myBrush, rc)
      e.Graphics.DrawString(DataGridView1.Columns(cell.ColumnIndex).HeaderText, .Font, Brushes.Black, rc, fmt)
      Else
      If rowID = 0 Then
      e.Graphics.FillRectangle(myBrush, rc)
      rowID = 1
      ElseIf rowID = 1 Then
      e.Graphics.FillRectangle(myBrush1, rc)
      rowID = 0
      End If
      e.Graphics.DrawString(DataGridView1.Rows(cell.RowIndex).Cells(cell.ColumnIndex).FormattedValue.ToString(), .Font, Brushes.Black, rc, fmt)
      End If
      x += rc.Width
      h = Math.Max(h, rc.Height)

      Next
      newpage = False
      y += h
      mRow += 1

      If y + h > e.MarginBounds.Bottom Then
      e.HasMorePages = True
      mRow -= 1
      newpage = True
      Exit Sub
      End If
      Loop
      mRow = 0
      End With
      End Sub


      I have tried to place the



      If rowID = 0 Then
      e.Graphics.FillRectangle(myBrush, rc)
      rowID = 1
      ElseIf rowID = 1 Then
      e.Graphics.FillRectangle(myBrush1, rc)
      rowID = 0
      End If


      in other places, but I get the same results. This use to be easy in ASP.Net, but now I am working in VB.Net. Any ideas?










      share|improve this question















      I fill a DatagridView with data, then I want to print this data in alternating colors, but when I do my PrintPreview I only see my columns show alternating colors.



      Pic
      Here is what I am trying;



      Private Sub PrintDocument1_PrintPage(sender As System.Object, e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
      With DataGridView1
      Dim fmt As StringFormat = New StringFormat(StringFormatFlags.LineLimit)
      fmt.LineAlignment = StringAlignment.Center
      fmt.Trimming = StringTrimming.EllipsisCharacter
      Dim y As Single = e.MarginBounds.Top - 50
      Dim myBrush As Brush
      Dim myBrush1 As Brush
      Dim rowID As Integer = 0

      myBrush = New SolidBrush(Color.AliceBlue)
      myBrush1 = New SolidBrush(Color.White)
      Do While mRow < .RowCount
      Dim row As DataGridViewRow = .Rows(mRow)
      Dim x As Single = e.MarginBounds.Left - 65
      Dim h As Single = 0
      For Each cell As DataGridViewCell In row.Cells
      Dim rc As RectangleF = New RectangleF(x, y, cell.Size.Width, cell.Size.Height)

      e.Graphics.DrawRectangle(Pens.Black, rc.Left, rc.Top, rc.Width, rc.Height)
      If (newpage) Then
      'e.Graphics.FillRectangle(myBrush, rc)
      e.Graphics.DrawString(DataGridView1.Columns(cell.ColumnIndex).HeaderText, .Font, Brushes.Black, rc, fmt)
      Else
      If rowID = 0 Then
      e.Graphics.FillRectangle(myBrush, rc)
      rowID = 1
      ElseIf rowID = 1 Then
      e.Graphics.FillRectangle(myBrush1, rc)
      rowID = 0
      End If
      e.Graphics.DrawString(DataGridView1.Rows(cell.RowIndex).Cells(cell.ColumnIndex).FormattedValue.ToString(), .Font, Brushes.Black, rc, fmt)
      End If
      x += rc.Width
      h = Math.Max(h, rc.Height)

      Next
      newpage = False
      y += h
      mRow += 1

      If y + h > e.MarginBounds.Bottom Then
      e.HasMorePages = True
      mRow -= 1
      newpage = True
      Exit Sub
      End If
      Loop
      mRow = 0
      End With
      End Sub


      I have tried to place the



      If rowID = 0 Then
      e.Graphics.FillRectangle(myBrush, rc)
      rowID = 1
      ElseIf rowID = 1 Then
      e.Graphics.FillRectangle(myBrush1, rc)
      rowID = 0
      End If


      in other places, but I get the same results. This use to be easy in ASP.Net, but now I am working in VB.Net. Any ideas?







      vb.net






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 12 at 3:21

























      asked Nov 12 at 3:15









      Mgfranz

      227




      227






















          1 Answer
          1






          active

          oldest

          votes

















          up vote
          0
          down vote



          accepted










          The issue is that your brush selection is inside the For Each loop over the cells. If you don't want to change the brush on each cell then don't select the brush on each cell. Put the code that selects the brush inside the outer loop but outside the inner loop.



          You should be doing something like this:



          Dim useAlternateBrush = False

          Using standardBrush As New SolidBrush(Color.AliceBlue),
          alternateBrush As New SolidBrush(Color.White)
          Do While mRow < .RowCount
          '...

          Dim brush = If(useAlternateBrush, alternateBrush, standardBrush)

          useAlternateBrush = Not useAlternateBrush

          '...

          For Each cell As DataGridViewCell In row.Cells
          '...

          'Use brush here.

          '...
          Next
          Loop
          End Using


          Notice that the SolidBrush objects are created with a Using statement, so that they are implicitly disposed at the End Using statement. Disposable objects should ALWAYS be disposed if at all possible, which is almost always the case, and short-lived, disposable objects should be created and disposed with a Using block.






          share|improve this answer






















          • Thanks, your solution worked. I tried moving the Brush outside the For loop but of course that won't work since RC is declared inside it. Your solution makes perfect sense and I thank you.
            – Mgfranz
            Nov 12 at 14:26










          Your Answer






          StackExchange.ifUsing("editor", function ()
          StackExchange.using("externalEditor", function ()
          StackExchange.using("snippets", function ()
          StackExchange.snippets.init();
          );
          );
          , "code-snippets");

          StackExchange.ready(function()
          var channelOptions =
          tags: "".split(" "),
          id: "1"
          ;
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function()
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled)
          StackExchange.using("snippets", function()
          createEditor();
          );

          else
          createEditor();

          );

          function createEditor()
          StackExchange.prepareEditor(
          heartbeatType: 'answer',
          convertImagesToLinks: true,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: 10,
          bindNavPrevention: true,
          postfix: "",
          imageUploader:
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          ,
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          );



          );













          draft saved

          draft discarded


















          StackExchange.ready(
          function ()
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53255533%2fprint-alternating-rows-in-color-din-datagridview-vb-net%23new-answer', 'question_page');

          );

          Post as a guest















          Required, but never shown

























          1 Answer
          1






          active

          oldest

          votes








          1 Answer
          1






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes








          up vote
          0
          down vote



          accepted










          The issue is that your brush selection is inside the For Each loop over the cells. If you don't want to change the brush on each cell then don't select the brush on each cell. Put the code that selects the brush inside the outer loop but outside the inner loop.



          You should be doing something like this:



          Dim useAlternateBrush = False

          Using standardBrush As New SolidBrush(Color.AliceBlue),
          alternateBrush As New SolidBrush(Color.White)
          Do While mRow < .RowCount
          '...

          Dim brush = If(useAlternateBrush, alternateBrush, standardBrush)

          useAlternateBrush = Not useAlternateBrush

          '...

          For Each cell As DataGridViewCell In row.Cells
          '...

          'Use brush here.

          '...
          Next
          Loop
          End Using


          Notice that the SolidBrush objects are created with a Using statement, so that they are implicitly disposed at the End Using statement. Disposable objects should ALWAYS be disposed if at all possible, which is almost always the case, and short-lived, disposable objects should be created and disposed with a Using block.






          share|improve this answer






















          • Thanks, your solution worked. I tried moving the Brush outside the For loop but of course that won't work since RC is declared inside it. Your solution makes perfect sense and I thank you.
            – Mgfranz
            Nov 12 at 14:26














          up vote
          0
          down vote



          accepted










          The issue is that your brush selection is inside the For Each loop over the cells. If you don't want to change the brush on each cell then don't select the brush on each cell. Put the code that selects the brush inside the outer loop but outside the inner loop.



          You should be doing something like this:



          Dim useAlternateBrush = False

          Using standardBrush As New SolidBrush(Color.AliceBlue),
          alternateBrush As New SolidBrush(Color.White)
          Do While mRow < .RowCount
          '...

          Dim brush = If(useAlternateBrush, alternateBrush, standardBrush)

          useAlternateBrush = Not useAlternateBrush

          '...

          For Each cell As DataGridViewCell In row.Cells
          '...

          'Use brush here.

          '...
          Next
          Loop
          End Using


          Notice that the SolidBrush objects are created with a Using statement, so that they are implicitly disposed at the End Using statement. Disposable objects should ALWAYS be disposed if at all possible, which is almost always the case, and short-lived, disposable objects should be created and disposed with a Using block.






          share|improve this answer






















          • Thanks, your solution worked. I tried moving the Brush outside the For loop but of course that won't work since RC is declared inside it. Your solution makes perfect sense and I thank you.
            – Mgfranz
            Nov 12 at 14:26












          up vote
          0
          down vote



          accepted







          up vote
          0
          down vote



          accepted






          The issue is that your brush selection is inside the For Each loop over the cells. If you don't want to change the brush on each cell then don't select the brush on each cell. Put the code that selects the brush inside the outer loop but outside the inner loop.



          You should be doing something like this:



          Dim useAlternateBrush = False

          Using standardBrush As New SolidBrush(Color.AliceBlue),
          alternateBrush As New SolidBrush(Color.White)
          Do While mRow < .RowCount
          '...

          Dim brush = If(useAlternateBrush, alternateBrush, standardBrush)

          useAlternateBrush = Not useAlternateBrush

          '...

          For Each cell As DataGridViewCell In row.Cells
          '...

          'Use brush here.

          '...
          Next
          Loop
          End Using


          Notice that the SolidBrush objects are created with a Using statement, so that they are implicitly disposed at the End Using statement. Disposable objects should ALWAYS be disposed if at all possible, which is almost always the case, and short-lived, disposable objects should be created and disposed with a Using block.






          share|improve this answer














          The issue is that your brush selection is inside the For Each loop over the cells. If you don't want to change the brush on each cell then don't select the brush on each cell. Put the code that selects the brush inside the outer loop but outside the inner loop.



          You should be doing something like this:



          Dim useAlternateBrush = False

          Using standardBrush As New SolidBrush(Color.AliceBlue),
          alternateBrush As New SolidBrush(Color.White)
          Do While mRow < .RowCount
          '...

          Dim brush = If(useAlternateBrush, alternateBrush, standardBrush)

          useAlternateBrush = Not useAlternateBrush

          '...

          For Each cell As DataGridViewCell In row.Cells
          '...

          'Use brush here.

          '...
          Next
          Loop
          End Using


          Notice that the SolidBrush objects are created with a Using statement, so that they are implicitly disposed at the End Using statement. Disposable objects should ALWAYS be disposed if at all possible, which is almost always the case, and short-lived, disposable objects should be created and disposed with a Using block.







          share|improve this answer














          share|improve this answer



          share|improve this answer








          edited Nov 12 at 3:39

























          answered Nov 12 at 3:31









          jmcilhinney

          25.1k21932




          25.1k21932











          • Thanks, your solution worked. I tried moving the Brush outside the For loop but of course that won't work since RC is declared inside it. Your solution makes perfect sense and I thank you.
            – Mgfranz
            Nov 12 at 14:26
















          • Thanks, your solution worked. I tried moving the Brush outside the For loop but of course that won't work since RC is declared inside it. Your solution makes perfect sense and I thank you.
            – Mgfranz
            Nov 12 at 14:26















          Thanks, your solution worked. I tried moving the Brush outside the For loop but of course that won't work since RC is declared inside it. Your solution makes perfect sense and I thank you.
          – Mgfranz
          Nov 12 at 14:26




          Thanks, your solution worked. I tried moving the Brush outside the For loop but of course that won't work since RC is declared inside it. Your solution makes perfect sense and I thank you.
          – Mgfranz
          Nov 12 at 14:26

















          draft saved

          draft discarded
















































          Thanks for contributing an answer to Stack Overflow!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid


          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.

          To learn more, see our tips on writing great answers.





          Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


          Please pay close attention to the following guidance:


          • Please be sure to answer the question. Provide details and share your research!

          But avoid


          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.

          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function ()
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53255533%2fprint-alternating-rows-in-color-din-datagridview-vb-net%23new-answer', 'question_page');

          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          Popular posts from this blog

          Top Tejano songwriter Luis Silva dead of heart attack at 64

          ReactJS Fetched API data displays live - need Data displayed static

          政党