作成日: 2023/04/20 最終更新日: 2023/04/20
文書種別
使用方法
詳細
C1NumericEditの上限値・下限値を設定し、これをC1FlexGridのエディタとして用いた場合、キーボードからの入力時にはC1NumericEditの検証による警告表示と入力制御が行われますが、クリップボードから貼り付けた値は、範囲外であっても表示されてしまいます。
この動作を避け、範囲外の値の入力を禁止するため、C1FlexGridのKeyDownイベントを利用できます。
KeyDownイベント内で、まず、貼り付けられた値がC1NumericEditで定義された上限と下限の範囲内にあるかどうか を確認します。次いで、当てはまらない場合はe.Handledプロパティを Trueに設定します。
以下に、1~100以外の値を貼り付けないようにするための、サンプルコードを記載します。

◎サンプルコード(VB)
この動作を避け、範囲外の値の入力を禁止するため、C1FlexGridのKeyDownイベントを利用できます。
KeyDownイベント内で、まず、貼り付けられた値がC1NumericEditで定義された上限と下限の範囲内にあるかどうか を確認します。次いで、当てはまらない場合はe.Handledプロパティを Trueに設定します。
以下に、1~100以外の値を貼り付けないようにするための、サンプルコードを記載します。
◎サンプルコード(VB)
Imports C1.Win.C1Input
Public Class Form1
'ReadOnly _numericEdit As C1NumericEdit
Dim _numericEdit As C1NumericEdit
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
'C1FlexGridの列の設定
C1FlexGrid1.Cols.Count = 2
C1FlexGrid1.Cols(1).DataType = GetType(Int32)
C1FlexGrid1.AutoClipboard = True
'C1NumericEditの上限値・下限値を設定
_numericEdit = New C1NumericEdit With {.VisibleButtons = DropDownControlButtonFlags.UpDown}
_numericEdit.PostValidation.Validation = PostValidationTypeEnum.ValuesAndIntervals
_numericEdit.PostValidation.Intervals.Add(New ValueInterval(1, 100, True, True))
_numericEdit.PostValidation.ErrorMessage = "範囲内の値(1~100)を入力して下さい"
'C1NumericEditをC1FlexGrid 列のエディタとして設定
C1FlexGrid1.Cols(1).Editor = _numericEdit
'KeyDownイベントの追加
AddHandler C1FlexGrid1.KeyDown, AddressOf C1FlexGrid1_KeyDown
End Sub
Private Sub C1FlexGrid1_KeyDown(sender As Object, e As KeyEventArgs)
'1列目でない場合は戻る
If (C1FlexGrid1.Col <> 1) Then
Return
End If
'Ctrl+V (貼り付けコマンド)が押された場合
If (e.Control AndAlso e.KeyCode = Keys.V) Then
'コピーされたテキストが空の場合は戻る
Dim text As String = Clipboard.GetText()
If String.IsNullOrEmpty(text) Then
Return
End If
'コピーした値が整数の場合
Dim copyValue As Integer
If Integer.TryParse(text, copyValue) Then
'C1NumericEditから入力可能範囲を取得
Dim vi As ValueInterval = _numericEdit.PostValidation.Intervals(0)
'数値が範囲内かどうかのチェック
Dim maxValid As Boolean = copyValue <= Convert.ToInt32(vi.MaxValue)
Dim minValid As Boolean = copyValue >= Convert.ToInt32(vi.MinValue)
'結果に応じてe.Handledの値を設定
e.Handled = Not (maxValid AndAlso minValid)
End If
End If
End Sub
End Class
◎サンプルコード(C#)
using C1.Win.C1Input;
namespace prj_C1FlexGrid
{
public partial class Form1 : Form
{
readonly C1NumericEdit _numericEdit;
public Form1()
{
InitializeComponent();
//C1FlexGridの列の設定
c1FlexGrid1.Cols.Count = 2;
c1FlexGrid1.Cols[1].DataType = typeof(Int32);
c1FlexGrid1.AutoClipboard = true;
//C1NumericEditの上限値・下限値を設定
_numericEdit = new C1NumericEdit { VisibleButtons = DropDownControlButtonFlags.UpDown };
_numericEdit.PostValidation.Validation = PostValidationTypeEnum.ValuesAndIntervals;
_numericEdit.PostValidation.Intervals.Add(new ValueInterval(1, 100, true, true));
_numericEdit.PostValidation.ErrorMessage = "範囲内の値(1~100)を入力して下さい";
//C1NumericEditをC1FlexGrid 列のエディタとして設定
c1FlexGrid1.Cols[1].Editor = _numericEdit;
//KeyDownイベントの追加
c1FlexGrid1.KeyDown += C1FlexGrid1_KeyDown;
}
private void C1FlexGrid1_KeyDown(object sender, KeyEventArgs e)
{
//1列目でない場合は戻る
if (c1FlexGrid1.Col != 1) return;
//Ctrl+V (貼り付けコマンド)が押された場合
if (e.Control && e.KeyCode == Keys.V)
{
//コピーされたテキストが空の場合は戻る
string text = Clipboard.GetText();
if (string.IsNullOrEmpty(text)) return;
//コピーした値が整数の場合
if (int.TryParse(text, out int copyValue))
{
//C1NumericEditから入力可能範囲を取得
ValueInterval vi = _numericEdit.PostValidation.Intervals[0];
//数値が範囲内かどうかのチェック
bool maxValid = copyValue <= Convert.ToInt32(vi.MaxValue);
bool minValid = copyValue >= Convert.ToInt32(vi.MinValue);
//結果に応じてe.Handledの値を設定
e.Handled = !(maxValid && minValid);
}
}
}
}
}