DataGridViewTextBox 열에서 숫자가 아닌 데이터를 사용하지 않도록 설정하는 방법이 있습니까?DataGridViewTextBoxColumn에서 텍스트 사용 안 함
내 데이터베이스의 필드는 부동이며 사용자가 숫자 값만 입력 할 수있게하려고합니다.
DataGridViewTextBox 열에서 숫자가 아닌 데이터를 사용하지 않도록 설정하는 방법이 있습니까?DataGridViewTextBoxColumn에서 텍스트 사용 안 함
내 데이터베이스의 필드는 부동이며 사용자가 숫자 값만 입력 할 수있게하려고합니다.
개인적으로이 문제가 발생하지 않았지만 몇 가지 방법을 알고 있습니다. 자신의 열 유형을 정의하여이를 제한하거나 DataGridView 이벤트를 처리 할 수 있습니다.
여기를보세요 : http://msdn.microsoft.com/en-us/library/wc5cbb9z.aspx특히 : CellValidating
및 CellValueChanged
당신은 또한 DataFridViewTextBox 칼럼의 편집 컨트롤의 TextChanged 이벤트를 듣고 시도하고 텍스트 상자에 잘못된 값을 inputing에서 사용자를 방지 할 수 있습니다. E.x .:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace WindowsApplication1
{
public partial class Form1 : Form
{
string _prevValue;
int _selLength;
int _selStart;
private bool _ignoreTxtChange;
public Form1()
{
DataGridView dataGridView = new DataGridView();
dataGridView.Dock = DockStyle.Fill;
Controls.Add(dataGridView);
DataTable ds = new DataTable();
ds.Columns.Add("FloatValue", typeof(float));
dataGridView.DataSource = ds;
dataGridView.EditingControlShowing += dataGridView_EditingControlShowing;
}
private void dataGridView_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
DataGridView dataGridView = (DataGridView)sender;
TextBox textBox = e.Control as TextBox;
if (textBox == null)
{
return;
}
textBox.TextChanged -= textBox_TextChanged;
DataGridViewColumn floatColumn = dataGridView.Columns["FloatValue"];
if (dataGridView.CurrentCell.ColumnIndex != floatColumn.Index)
{
return;
}
textBox.TextChanged += textBox_TextChanged;
_prevValue = textBox.Text;
}
void textBox_TextChanged(object sender, EventArgs e)
{
if (_ignoreTxtChange)
{
return;
}
_ignoreTxtChange = true;
TextBox textBox = (TextBox)sender;
float value;
if ((_prevValue == textBox.Text) || float.TryParse(textBox.Text, out value))
{
_prevValue = textBox.Text;
_selLength = textBox.SelectionLength;
_selStart = textBox.SelectionStart;
}
else
{
textBox.Text = _prevValue;
textBox.Select((_selStart == 0) ? 0 : _selStart - 1, _selLength);
}
_ignoreTxtChange = false;
}
}
}
이와 관련하여 상당한 성능 저하가있을 것으로 생각하십니까? 만약 그가'CellValidating' 이벤트를 처리한다면 그는 찾고 있던 컬럼과 일치하는'ColumnIndex'의 원하는 타입으로 값을'TryCast' 할 수 있습니다. 이렇게하면 사용자가'TextBoxColumn'의 행을 입력 할 때마다 이벤트가 추가/제거되지 않습니다. 대신 사용자가 데이터 입력을 완료하면 하나의 확인을 수행합니다. 또한 추가 열에 유사한 제한이 필요한 경우 더 적은 코드가 필요하고 관리가 쉬울 것입니다. – Origin
상당한 성능 저하는 없습니다. 편집 컨트롤에서 유효성 검사를 수행하면 얻는 주된 이점은 셀에 잘못된 값이 입력되는 것을 방지 할 수 있다는 것입니다. –