0

ユーザーが数字のみを入力できるようにしたいデータグリッドビューがあります。しかし、ユーザーが誤って文字を入力すると、エラーメッセージが表示されます。しかし、メッセージボックスにある「OK」ボタンをクリックした後に問題が発生します、その特定のセル値をクリアして、ユーザーが別の値を入力できるようにしたいのですが、どうすればよいですか?

どのイベントまたは関数を使用する必要がありますか。

前もって感謝します....

4

2 に答える 2

1

行インデックスを取得し、行インデックスからセル インデックスを取得します。値を変更できるように

于 2012-07-03T11:07:39.847 に答える
0

考えただけで、これは古い質問であることはわかっていますが、最初はセルが数値のみを受け入れるように制限しています。これを行うには、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;
    }
}

これが将来あなたに役立つことを願っています

于 2014-03-01T10:08:23.803 に答える