を十分に速くテストすることができ、非常に簡単な解決策であるが、異なる行動で、その後、私はあなたが作成することをおすすめ新しいコントロールPrimeNumberUpDown
はNumericUpDown
コントロールを拡張します。
ここでは、一緒にクイックバージョンです。私はそれがマウスまたは矢印キーを使用して上下に動作し、テキストボックスに数字を入力することをテストしました。重要なことが起こった場合は、それをもっと徹底的にテストしたいかもしれません。
このファイルを新しいファイルに貼り付け(名前空間を適宜更新する)、コンパイルすると、ツールボックスにPrimeNumberUpDown
コントロールが表示され、他のWindowsフォームコントロールと同じように使用できます。
using System;
using System.Globalization;
using System.Windows.Forms;
namespace YourNameSpace
{
public class PrimeNumberUpDown : NumericUpDown
{
private int _value;
public PrimeNumberUpDown()
{
// Make sure default value is prime
if (!IsPrime((int)Value))
SetNextPrimeValue();
_value = (int)Value;
}
public override void DownButton()
{
SetNextPrimeValue();
}
public override void UpButton()
{
SetPreviousPrimeValue();
}
private void SetNextPrimeValue()
{
int newValue = (int)Value;
while (newValue <= Maximum)
{
if (IsPrime(++newValue))
{
if (newValue <= Maximum)
{
Value = newValue;
_value = newValue;
}
return;
}
}
}
private void SetPreviousPrimeValue()
{
int newValue = (int)Value;
while (newValue >= Minimum)
{
if (IsPrime(--newValue))
{
if (newValue >= Minimum)
{
Value = newValue;
_value = newValue;
}
return;
}
}
}
protected override void ValidateEditText()
{
if (_value == 0)
{
base.ValidateEditText();
return;
}
int newValue;
if (int.TryParse(Text, out newValue) && IsPrime(newValue) && newValue >= Minimum && newValue <= Maximum)
{
_value = newValue;
base.ValidateEditText();
}
else
{
ChangingText = true;
Text = _value.ToString(CultureInfo.InvariantCulture);
}
}
private static bool IsPrime(int number)
{
if (number == 1) return false;
if (number == 2) return true;
if (number % 2 == 0) return false;
int boundary = (int)Math.Floor(Math.Sqrt(number));
for (int i = 3; i <= boundary; i += 2)
{
if (number % i == 0) return false;
}
return true;
}
}
}
こんにちは。質問をするにはこちらをお読みください。あなたはあなたが何をしたのか、何が欠けているのかを明記し、他の人があなたを助けることができるようにするべきですhttps://stackoverflow.com/help/how-to-ask –
Ashkanどのタイプのロジックを使用する必要があるかわからないので、私は何もしませんでした。 –
あなたは降順を意味するでしょうか? –