我有一些代码来指示我的WinForm上的字段何时发生更改。
如果Control是TextBox,我会根据 Control 的 Text 是否等于默认(或初始)值来更改ForeColor和BackColor 。
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();
}
}
如果 Control 是DateTimePicker或ComboBox,我真的不能这样做(没有可见的 ForeColor 或 BackColor),所以我更改了与 Control 关联的 Label。
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();
}
}
我想创建某种扩展方法,可以根据控件是什么以及值是否已更改来更改控件的 ForeColor 和 BackColor。
这是一个尝试,但this
在代码中的使用无效,并且扩展方法不会出现在我想要使用它们的任何控件上。
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;
}
}
}
有没有办法接近我正在尝试做的事情,或者这不是扩展方法的用途?
我想结束这样的事情:
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();
}
}
解决方案:
使用下面检查的答案,我编写了以下扩展方法:
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;
}
}
}
以下是我将如何使用它:
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();
}
}
我希望其他人也能从中受益。〜乔。