2

WinFormのフィールドがいつ変更されたかを示すコードがあります。

コントロールTextBoxの場合、コントロールのテキストがデフォルト(または初期)値と等しいかどうかに応じて、 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();
  }
}

コントロールがDateTimePickerまたはComboBoxの場合、これを実際に行うことはできません(ForeColorまたはBackColorは表示されません)。そのため、コントロールに関連付けられているラベルを変更します。

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

owned..の代わりにyourを使用thisし、RowlandShawが言うように..の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

これにより、Colorの代わりにControlが拡張されます(静的クラスで定義する必要があります)。

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 に答える