Text
からプロパティを分割できますtbxConvertito
。
また、TextBox でテキストが変更される場合はnumericUpDown1_ValueChanged
、NumericUpDown の設定を制限するために呼び出す必要があります。
public partial class Form1 : Form
{
public decimal myDecimal = 3755.25012345M;
public Form1()
{
InitializeComponent();
tbxConvertito.Text = myDecimal.ToString();
numericUpDown1_ValueChanged(this, EventArgs.Empty);
}
private void numericUpDown1_ValueChanged(object sender, EventArgs e)
{
int decimalPlace = (int)numericUpDown1.Value;
string[] numbers = tbxConvertito.Text.Split(new char[] { '.', ',' });
string tmp = string.Empty;
if (numbers.Length != 1)
{
if (decimalPlace <= numbers[1].Length)
{
tmp = "," + numbers[1].Substring(0, decimalPlace);
if (tmp.EndsWith(","))
tmp = string.Empty;
}
else
tmp = "," + numbers[1];
}
tbxConvertito.Text = numbers[0] + tmp;
tbxConvertito.Select(tbxConvertito.Text.Length, 0);
}
private void tbxConvertito_TextChanged(object sender, EventArgs e)
{
numericUpDown1_ValueChanged(this, EventArgs.Empty);
decimal.TryParse(tbxConvertito.Text.Replace(',', '.'), out myDecimal);
}
}
データを失うことなく:
public partial class Form1 : Form
{
public decimal myDecimal = 0;
public Form1()
{
InitializeComponent();
// init value
tbxConvertito.Text = myDecimal.ToString();
numericUpDown1_ValueChanged(this, EventArgs.Empty);
}
private void numericUpDown1_ValueChanged(object sender, EventArgs e)
{
int decimalPlace = (int)numericUpDown1.Value;
string[] numbers = myDecimal.ToString().Split(new char[] { '.', ',' });
string tmp = string.Empty;
if (numbers.Length != 1)
{
if (decimalPlace <= numbers[1].Length)
{
tmp = "," + numbers[1].Substring(0, decimalPlace);
if (tmp.EndsWith(","))
tmp = string.Empty;
}
else
tmp = "," + numbers[1];
}
tbxConvertito.Text = numbers[0] + tmp;
tbxConvertito.Select(tbxConvertito.Text.Length, 0);
}
private void tbxConvertito_TextChanged(object sender, EventArgs e)
{
if (keyValue == 188) return;
if (keyPressed)
{
string stringValue = tbxConvertito.Text;
if ((stringValue.Contains(',') && stringValue.Split(new char[] { ',' })[1].Length <= (int)numericUpDown1.Value) || !stringValue.Contains(','))
decimal.TryParse(tbxConvertito.Text.Replace(',', '.'), out myDecimal);
keyPressed = false;
}
numericUpDown1_ValueChanged(this, EventArgs.Empty);
Console.WriteLine("Displayed value: {0}", tbxConvertito.Text);
Console.WriteLine("Actual value: {0}", myDecimal);
}
bool keyPressed = false;
int keyValue;
private void tbxConvertito_KeyDown(object sender, KeyEventArgs e)
{
keyValue = e.KeyValue;
keyPressed = true;
}
}
シナリオ:
- [小数点以下の桁数 = 0] [1]、[1234]、[12345] などと入力できます
- [小数点以下の桁数 = 1] たとえば、[1,1]、[1234]、[12345,3]と入力
できます。NumericUpDown の値を 0 に変更すると、表示される値は [1]、[1234]、[12345]になり
ます。 NumericUpDown の値を 1 に変更すると、表示される値は [1,1]、[1234]、[12345,3] になります。
- [小数点以下の桁数 = 1] ステップ 2 と同じ状況
これで、データが失われることはありません。ユーザーがテキストボックスに何かを入力した場合にのみ、元のデータを更新します。