Reputation:
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
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
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
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
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