ユーザーが数字のみを入力できるようにしたいデータグリッドビューがあります。しかし、ユーザーが誤って文字を入力すると、エラーメッセージが表示されます。しかし、メッセージボックスにある「OK」ボタンをクリックした後に問題が発生します、その特定のセル値をクリアして、ユーザーが別の値を入力できるようにしたいのですが、どうすればよいですか?
どのイベントまたは関数を使用する必要がありますか。
前もって感謝します....
ユーザーが数字のみを入力できるようにしたいデータグリッドビューがあります。しかし、ユーザーが誤って文字を入力すると、エラーメッセージが表示されます。しかし、メッセージボックスにある「OK」ボタンをクリックした後に問題が発生します、その特定のセル値をクリアして、ユーザーが別の値を入力できるようにしたいのですが、どうすればよいですか?
どのイベントまたは関数を使用する必要がありますか。
前もって感謝します....
行インデックスを取得し、行インデックスからセル インデックスを取得します。値を変更できるように
考えただけで、これは古い質問であることはわかっていますが、最初はセルが数値のみを受け入れるように制限しています。これを行うには、ProcessCmdKey メソッドをオーバーライドします。ここに私が使用するいくつかのコードがあり、それはあなたのために働くはずです。グリッド名を dgListData からグリッドの名前に変更することを忘れないでください:
/// <summary>
/// The purpose of this method is two fold. First it stops the data grid
/// from adding a new row when the enter key is pressed during editing a cell
/// Secondly it filters the keys for numeric characters only when the selected
/// cell type is of a numeric type.
/// </summary>
/// <param name="msg"></param>
/// <param name="keyData"></param>
/// <returns></returns>
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
//Let's get fancy and detect the column type and then filter the keys as needed.
if (!dgListData.IsCurrentCellInEditMode) return base.ProcessCmdKey(ref msg, keyData); //only go into the routine if we are in edit mode
if (helper.IsNumericType(dgListData.CurrentCell.ValueType))
{
if (helper.NumericFilterKeyData(keyData)) return true; //override the key
}
// Check if Enter is pressed
if (keyData != Keys.Enter) return base.ProcessCmdKey(ref msg, keyData);
// If there isn't any selected row, do nothing
SetFocusToNextVisibleColumn(dgListData);
return true;
}
private void SetFocusToNextVisibleColumn(DataGridView dgViewTarget)
{
if (dgViewTarget.CurrentCell == null) return;
Console.WriteLine(dgViewTarget.CurrentCell.Value);
if (dgViewTarget.CurrentCell.IsInEditMode) dgViewTarget.EndEdit();
var currentColumn = dgViewTarget.CurrentCell.ColumnIndex;
if (currentColumn < dgViewTarget.ColumnCount) ++currentColumn;
for (var i = currentColumn; i < dgViewTarget.ColumnCount; i++)
{
if (!dgViewTarget[i, dgViewTarget.CurrentRow.Index].Displayed) continue;
dgViewTarget.CurrentCell = dgViewTarget[i, dgViewTarget.CurrentRow.Index];
break;
}
}
また、プロジェクト全体で使用する静的ヘルパー クラスもあります。必要な 2 つのルーチンは次のとおりです。新しい helper.cs クラスを追加して、このコードを貼り付けるだけです。
public static class helper
{
private static readonly KeysConverter Kc = new KeysConverter();
/// <summary>
/// Filters the keys for numeric entry keys
/// </summary>
/// <param name="keyData"></param>
/// <returns></returns>
public static bool NumericFilterKeyData(Keys keyData)
{
var keyChar = Kc.ConvertToString(keyData);
return !char.IsDigit(keyChar[0])
&& keyData != Keys.Decimal
&& keyData != Keys.Delete
&& keyData != Keys.Tab
&& keyData != Keys.Back
&& keyData != Keys.Enter
&& keyData != Keys.OemPeriod
&& keyData != Keys.NumPad0
&& keyData != Keys.NumPad1
&& keyData != Keys.NumPad2
&& keyData != Keys.NumPad3
&& keyData != Keys.NumPad4
&& keyData != Keys.NumPad5
&& keyData != Keys.NumPad6
&& keyData != Keys.NumPad7
&& keyData != Keys.NumPad8
&& keyData != Keys.NumPad9;
}
/// <summary>
/// Determines if a type is numeric. Nullable numeric types are considered numeric.
/// </summary>
/// <remarks>
/// Boolean is not considered numeric.
/// </remarks>
public static bool IsNumericType(Type type)
{
if (type == null)
{
return false;
}
switch (Type.GetTypeCode(type))
{
case TypeCode.Byte:
case TypeCode.Decimal:
case TypeCode.Double:
case TypeCode.Int16:
case TypeCode.Int32:
case TypeCode.Int64:
case TypeCode.SByte:
case TypeCode.Single:
case TypeCode.UInt16:
case TypeCode.UInt32:
case TypeCode.UInt64:
return true;
case TypeCode.Object:
if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>))
{
return IsNumericType(Nullable.GetUnderlyingType(type));
}
return false;
}
return false;
}
/// <summary>
/// Tests if the Object is of a numeric type This is different than testing for NumericType
/// as this expects an object that contains an expression like a sting "123"
/// </summary>
/// <param name="expression">Object to test</param>
/// <returns>true if it is numeric</returns>
public static bool IsNumeric(Object expression)
{
if (expression == null || expression is DateTime)
return false;
if (expression is Int16 || expression is Int32 || expression is Int64 || expression is Decimal ||
expression is Single || expression is Double || expression is Boolean)
return true;
try
{
if (expression is string)
{
if (
expression.ToString()
.IndexOfAny(
@" abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOOPQRSTUVWXYZ!@#$%^&*?<>[]|+-*/\'`~_"
.ToCharArray()) != -1) return false;
}
else
{
Double.Parse(expression.ToString());
}
return true;
}
catch
{
} // just dismiss errors but return false
return false;
}
}
これが将来あなたに役立つことを願っています