在单元格

时间:2016-10-11 16:26:56

标签: c# datagridview

我正在C#dot Net开发一个销售点应用程序,其中包含一个datagridview。

我想将datagridview的某些单元格值限制为以下内容。

  • 不要在单元格的开头输入一个Dot("。")(这是真的需要)。
  • 请勿输入任何字母或任何其他字符。 (我已经开发了这个,但需要一个改进的想法)
  • 仅输入带负数的数值。 (我已经开发了这个,但需要一个改进的想法)

在这种情况下引导我。

以下是我的代码

 private void Numeric_KeyPress(object sender, KeyPressEventArgs e)
 {
    if (!char.IsControl(e.KeyChar) && !char.IsDigit(e.KeyChar) && e.KeyChar != '.' && e.KeyChar != 46)
    //if (!char.IsDigit(e.KeyChar) && e.KeyChar != '.')
    {
      e.Handled = true;
    }
    // only allow one decimal point
    if ((e.KeyChar == '.') && ((sender as TextBox).Text.IndexOf('.') > -1) && ((sender as TextBox).Text.IndexOf('.') != 1))
    {
      e.Handled = true;
    }
} 

    private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
        {
            e.Control.KeyPress -= new KeyPressEventHandler(Numeric_KeyPress);
            if (dataGridView1.CurrentCell.ColumnIndex == 1)
            {
                TextBox tb = e.Control as TextBox;
                if (tb != null)
                {                     
                    tb.KeyPress += new KeyPressEventHandler(Numeric_KeyPress);
                }
            }

}

1 个答案:

答案 0 :(得分:0)

最简单的方法是处理CurrentCellDirtyStateChanged事件。

我使用正则表达式来验证值。此代码允许您仅输入包含负数的数字。

private void DataGridView_CurrentCellDirtyStateChanged(object sender, EventArgs e)
{
    var cell = dataGridView.CurrentCell;
    if (cell.ColumnIndex != 1)
        return;

    string value = cell.EditedFormattedValue.ToString();
    string pattern = @"^-$ | ^-?0$ | ^-?0\.\d*$ | ^-?[1-9]\d*\.?\d*$";

    if (Regex.IsMatch(value, pattern, RegexOptions.IgnorePatternWhitespace))
    {
        dataGridView.CommitEdit(DataGridViewDataErrorContexts.Commit);
    }
    else
    {
        dataGridView.CancelEdit();
    }
}

注意:此代码不允许用户在自己的文化中输入数字。