получение позиции каретки из DataGridView - PullRequest
0 голосов
/ 25 февраля 2020

Я ищу, чтобы проверить вход в DataGridView, что имеет DataGridViewTextBoxCells. Ячейки текстового поля могут быть как со знаком, так и без знака, и int или двойными, в зависимости от того, в каком столбце находится фокус. Проблема, с которой я сталкиваюсь, заключается в определении положения каретки при нажатии клавиши.

Например, если ячейка допускает двойные числа со знаком (символ вставки <=> '^'):

  • допустимое событие нажатия клавиши: ^ 12.3456 с нажатием клавиши '-' даст -12.3456
  • недопустимое событие нажатия клавиши: 12.34-56 с нажатием клавиши '-' даст 12.34-56

Я не смог найти ничего, что позволило бы мне чтобы получить доступ к положению каретки во время нажатия клавиши.

private void SomeGridView_KeyPress(object sender, KeyPressEventArgs e)
{
    DataGridView DGV = SomeGridView;

    string curStr;

    bool isFirst = DGV.CurrentCell.EditedFormattedValue == null;
    curStr = isFirst ? "" : DGV.CurrentCell.EditedFormattedValue.ToString();
    Type type = DGV.CurrentCell.GetType();
    if (DGV.CurrentCell.GetType() == typeof(DataGridViewTextBoxCell))
    {
        DataGridViewTextBoxCell DGVTB = (DataGridViewTextBoxCell)DGV.CurrentCell;
        //Not sure how to get caret here
    }

    switch ((GridDataEnum)DGV.CurrentCell.ColumnIndex)
    {
        case GridDataEnum.setpoint:
        case GridDataEnum.SlopePoint:
            e.Handled = !HelperUtils.isValidNumber(curStr, e.KeyChar, HelperUtils.TargetNumberTypeEnum.signedDouble);
            break;
        case GridDataEnum.lowerX:
        case GridDataEnum.upperX:
        case GridDataEnum.TransX:
        case GridDataEnum.constY:
            e.Handled = !HelperUtils.isValidNumber(curStr, e.KeyChar, HelperUtils.TargetNumberTypeEnum.unsignedDouble);
            break;
    }
}

Спасибо

1 Ответ

0 голосов
/ 25 февраля 2020

В случае, если кто-то еще ищет его, я нашел ответ благодаря LarsTech.

private void SomeGridView_KeyPress(object sender, KeyPressEventArgs e)
{
    DataGridView DGV = SomeGridView;

    string curStr;

    bool isFirst = DGV.CurrentCell.EditedFormattedValue == null;
    curStr = isFirst ? "" : DGV.CurrentCell.EditedFormattedValue.ToString();
    Type type = DGV.CurrentCell.GetType();
    if (DGV.CurrentCell.GetType() == typeof(DataGridViewTextBoxCell))
    {
        DataGridViewTextBoxCell DGVTB = (DataGridViewTextBoxCell)DGV.CurrentCell;
        if (DGV.CurrentCell.EditType == typeof(DataGridViewTextBoxEditingControl))
            if(DGV.EditingControl != null)
                charIndex = ((TextBox)DGV.EditingControl).SelectionStart;
    }

    switch ((GridDataEnum)DGV.CurrentCell.ColumnIndex)
    {
        case GridDataEnum.setpoint:
        case GridDataEnum.SlopePoint:
            e.Handled = !HelperUtils.isValidNumber(curStr, e.KeyChar, HelperUtils.TargetNumberTypeEnum.signedDouble, charIndex);
            break;
        case GridDataEnum.lowerX:
        case GridDataEnum.upperX:
        case GridDataEnum.TransX:
        case GridDataEnum.constY:
            e.Handled = !HelperUtils.isValidNumber(curStr, e.KeyChar, HelperUtils.TargetNumberTypeEnum.unsignedDouble, charIndex);
            break;
    }
}
...