user153923
user153923

Reputation:

Extension Method Solution

I've got some code to indicate when a field on my WinForm has changed.

If the Control is a TextBox, I alter the ForeColor and BackColor depending on if the Text of the Control is equal to the default (or initial) value.

private void LastName_Changed(object sender, EventArgs e) {
  if (sender.Equals(txtLastName)) {
    if (emp0.LastName != txtLastName.Text) {
      txtLastName.ForeColor = changedTxtFont;
      txtLastName.BackColor = changedTxtBack;
      btnOK.Enabled = true;
    } else {
      txtLastName.ForeColor = systemTxtFont;
      txtLastName.BackColor = systemTxtBack;
    }
    AuthenticationReset();
  }
}

If the Control is a DateTimePicker or ComboBox, I can't really do this (there is no visible ForeColor or BackColor), so I alter the Label that is associated with the Control.

private void TrainDate_Changed(object sender, EventArgs e) {
  if (sender.Equals(dtTrainDate)) {
    DateTime trainDate = Global.SqlDate(emp0.TrainDate);
    if (trainDate != dtTrainDate.Value) {
      lblTrainDate.ForeColor = changedLblFont;
      lblTrainDate.BackColor = changedLblBack;
      btnOK.Enabled = true;
    } else {
      lblTrainDate.ForeColor = systemLblFont;
      lblTrainDate.BackColor = systemLblBack;
    }
    AuthenticationReset();
  }
}

I'd like to create some sort of Extension Method that could change the ForeColor and BackColor of a Control dependent upon what that Control is and if the value had changed.

Here is an attempt, but the use of this in the code is not valid and the extension methods do not show up for any of the Controls I want to use them on.

public static class ColorChange {

  public static Color ForeColorChange(this Color owned, bool changed) {
    if (this is TextBox) {
      return changed ? Color.Red : SystemColors.WindowText;
    } else {
      return changed ? Color.Red : SystemColors.ControlText;
    }
  }

  public static Color BackColorChange(this Color owned, bool changed) {
    if (this is TextBox) {
      return changed ? Color.Yellow : SystemColors.Window;
    } else {
      return SystemColors.Control;
    }
  }

}

Is there a way to approach what I'm trying to do or is this not what Extension Methods are for?

I'd like to end up with something like this:

private void TrainDate_Changed(object sender, EventArgs e) {
  if (sender.Equals(dtTrainDate)) {
    DateTime trainDate = Global.SqlDate(emp0.TrainDate);
    if (trainDate != dtTrainDate.Value) {
      lblTrainDate.ForeColorChange(true);
      lblTrainDate.BackColorChange(true);
      btnOK.Enabled = true;
    } else {
      lblTrainDate.ForeColorChange(false);
      lblTrainDate.BackColorChange(false);
    }
    AuthenticationReset();
  }
}

Solution:

Using the answer checked below, I wrote the following Extension Method:

public static class ColorChange {
  public static void AlteredText(this Control owned, bool changed) {
    if (owned is TextBox) {
      owned.ForeColor = changed ? Color.Red : SystemColors.WindowText;
      owned.BackColor = changed ? Color.Yellow : SystemColors.Window;
    } else {
      owned.ForeColor = changed ? Color.Red : SystemColors.ControlText;
      owned.BackColor = SystemColors.Control;
    }
  }
}

Here is how I will be using it:

private void TrainDate_Changed(object sender, EventArgs e) {
  if (sender.Equals(dtTrainDate)) {
    DateTime trainDate = Global.SqlDate(emp0.TrainDate);
    if (trainDate != dtTrainDate.Value) {
      lblTrainDate.AlteredText(true);
      btnOK.Enabled = true;
    } else {
      lblTrainDate.AlteredText(false);
    }
    AuthenticationReset();
  }
}

I hope others get use out of this as well. ~Joe.

Upvotes: 2

Views: 1295

Answers (4)

Matteo B.
Matteo B.

Reputation: 4064

Use your owned instead of this.. oh and as Rowland Shaw says, Control instead of Color.

So your code should finally be

public static Color ForeColorChange(this Control owned, bool changed) {
  if (owned is TextBox) {
    return changed ? Color.Red : SystemColors.WindowText;
  } else {
    return changed ? Color.Red : SystemColors.ControlText;
  }
}

public static Color BackColorChange(this Control owned, bool changed) {
  if (owned is TextBox) {
    return changed ? Color.Yellow : SystemColors.Window;
  } else {
    return SystemColors.Control;
  }
}

Upvotes: 1

Hashmush
Hashmush

Reputation: 2053

This extends Control instead of Color (needs to be defined in a static class):

public static void ForeColorChange(this Control owned, bool changed) {
  if (owned is TextBox) {
    owned.ForeColor = changed ? Color.Red : SystemColors.WindowText;
  } else {
    owned.ForeColor = changed ? Color.Red : SystemColors.ControlText;
  }
}

public static void BackColorChange(this Control owned, bool changed) {
  if (owned is TextBox) {
    owned.BackColor = changed ? Color.Yellow : SystemColors.Window;
  } else {
    owned.BackColor =  SystemColors.Control;
  }
}

Usage:

TextBox box = ...;
box.ForeColorChange(true);

Upvotes: 1

Jan
Jan

Reputation: 2168

If you want to call your extension method on your textbox, you have to do this in the toplevel of your namespace:

public static class Extensions
{
  public static void myExtensionMethod(this Textbox textbox)
  {
    //Do what you want to do
  }
}

And then it is accessible over your textbox:

Textbox myTextbox = new Textbox();
myTextbox.myExtensionMethod();

If you want, you can also pass parameters to your extension method.

Upvotes: 1

Rowland Shaw
Rowland Shaw

Reputation: 38130

You've defined extension methods for the Color class, not Control, which is why it won;t show for controls. In addition, your methods probably want to inspect the owned control that you'll need to pass in.

Upvotes: 4

Related Questions