2

我有一些代码来指示我的WinForm上的字段何时发生更改。

如果ControlTextBox,我会根据 Control 的 Text 是否等于默认(或初始)值来更改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();
  }
}

如果 Control 是DateTimePickerComboBox,我真的不能这样做(没有可见的 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();
  }
}

我希望其他人也能从中受益。〜乔。

4

4 回答 4

4

您已经为Color类定义了扩展方法,而不是Control,这就是它不会显示控件的原因。此外,您的方法可能想要检查owned您需要传入的控件。

于 2012-08-24T16:26:20.667 回答
1

使用 yourowned而不是this.. 哦,正如 Rowland 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;
  }
}
于 2012-08-24T16:26:57.703 回答
1

这扩展了 Control 而不是 Color(需要在静态类中定义):

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);
于 2012-08-24T16:29:12.757 回答
1

如果要在文本框上调用扩展方法,则必须在命名空间的顶层执行此操作:

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

然后可以通过您的文本框访问它:

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

如果需要,您还可以将参数传递给您的扩展方法。

于 2012-08-24T16:29:37.950 回答