2012-08-24 40 views
2

我有一些代码来指示我的WinForm上的某个字段发生了更改。扩展方法解决方案

如果ControlTextBox,我根据控件的文本是否等于默认(或初始)值来更改ForeColorBackColor

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(); 
    } 
} 

如果控制是一个DateTimePickerComboBox,我真的不能做到这一点(没有明显的前景色背景色或),所以我改变了与控制相关的标签。

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(); 
    } 
} 

我想创建某种Extension Method可能会改变取决于什么控制是,如果该值已经改变控件的前景色和背景色。

这是一个尝试,但在代码中使用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(); 
    } 
} 

我希望别人也可以使用它。 〜乔。

+1

这些方法是在静态类中声明的吗?: –

+0

是的。我确实有一个静态类,它们被定义在。好问题! – jp2code

+0

所以尝试调用它们像'(TextBox(Control))。ForeColor.ForeColorChange(true);' –

回答

1

这样可延长控制,而非彩色打印(需要一个静态类中定义):

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; 
    } 
} 

用法:

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

+1。你正在进入某种东西,而且我正在理解它(很多说)。第二种方法仍然显示“Color”类型,但我明白你在说什么。 – jp2code

+0

糟糕,修好了。 – Hashmush

4

您已经为Color类定义了扩展方法,而不是Control,这就是为什么它赢了;为控件显示。此外,你的方法可能要检查owned控制,你会需要传递。

1

使用您的owned代替this ..哦并作为罗兰Shaw说,Control代替Color

所以,你的代码应该终于可以

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; 
    } 
} 
1

如果你想在你的文本框中调用你的扩展方法,你必须在你的名字空间的顶层执行这个操作:

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

然后它是在你的文本框访问:

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

如果你愿意,你也可以传递参数给你的扩展方法。

+0

虽然这种技术不能够通用于Label控件。 ...如果我没错的话。 – jp2code

+0

一般来说,它也可以使用标签。但Label不会继承Control。所以如果你扩展Control类,标签不知道它。如果你需要**有一个总是有效的单一方法,你可以创建一个自定义的DateTimePicker/ComboBox并在那里附上一个标签。然后这些控件拥有标签的句柄,并且扩展方法可以更改它。 – Jan