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.
(TextBox(Control)).ForeColor.ForeColorChange(true);