Cort
Cort

Reputation: 3

Why doesn't my richtextbox change the color?

I'm trying to give the letters in my richtextbox different colors for my subnet calculator, but the richtextbox doesn't change the colors until the 26th letter.

How it looks:

How it looks

        int iValueSm = trackBarSmMask.Value;
        rtbScroll.Text = "";
        rtbScroll.SelectionStart = rtbScroll.TextLength;
        rtbScroll.SelectionLength = 0;

        for (int i = 1; i <= iValueSm; i++)
        {
            rtbScroll.SelectionColor = Color.Blue;
            rtbScroll.AppendText("N");              

            if (i%8==0 && i != 32)
            {
                rtbScroll.Text = rtbScroll.Text + "."; 
            }
        }

        for (int i = iValueSm+1; i <= 32; i++)
        {
            rtbScroll.SelectionColor = Color.Red;
            rtbScroll.AppendText("H");              

            if (i % 8 == 0 && i != 32)
            {
                rtbScroll.Text = rtbScroll.Text + ".";
            }
        }

        labelAmountNetID.Text = "/" + iValueSm.ToString();

Upvotes: 0

Views: 42

Answers (2)

Idle_Mind
Idle_Mind

Reputation: 39132

Anytime you set the .Text() property, you RESET all formatting back to black and white.

Here is how I'd write it using SelectedText:

enter image description here

private void Form1_Load(object sender, EventArgs e)
{
    updateRTB();
}

private void trackBarSmMask_ValueChanged(object sender, EventArgs e)
{
    updateRTB();
}

private void trackBarSmMask_Scroll(object sender, EventArgs e)
{
    updateRTB();
}

private void updateRTB()
{            
    rtbScroll.Text = "";
    rtbScroll.SelectionStart = 0;
    rtbScroll.SelectionLength = 0;
    int iValueSm = trackBarSmMask.Value;
    labelAmountNetID.Text = "/" + iValueSm.ToString();
    for (int i = 1; i <= 32; i++)
    {
        rtbScroll.SelectionColor = (i <= iValueSm) ? Color.Blue : Color.Red;
        rtbScroll.SelectedText = (i <= iValueSm) ? "N" : "H";
        if (i % 8 == 0 && i != 32)
        {
            rtbScroll.SelectionColor = Color.Black;
            rtbScroll.SelectedText = ".";
        }
    }
}

Upvotes: 1

Jonathan Applebaum
Jonathan Applebaum

Reputation: 5986

Well, can be a lot of approaches to deal with this problem but here is one suggestion:

// Track bar definitions...
 private void SetTrackBarVals()
 {
     trackBar1.Minimum = 0;
     trackBar1.Maximum = 31;
 }

 private void trackBar1_Scroll(object sender, EventArgs e)
 {
     var counter = 0;
     var dotsCounter = 0;
     rtbScroll.Text = "";
     int iValueSm = trackBar1.Value + 1; // +1 because we start counting from 0

     for (int i = 1; i <= 32; i++)
     {
         if (counter > 0 && counter % 8 == 0)
         {
             // new octet
             rtbScroll.AppendText(".");
             dotsCounter++;
         }

         if (i > iValueSm)
         {
             // It is red
             rtbScroll.AppendText("H");
             rtbScroll.SelectionStart = (i - 1) + dotsCounter;
             rtbScroll.SelectionLength = 1 ;
             rtbScroll.SelectionColor = Color.Red;
         }
         else
         {
             rtbScroll.AppendText("N");
         }

         counter++;
     } 
 }

Upvotes: 1

Related Questions