2012-02-02 3 views

답변

0

개인적으로이 문제가 발생하지 않았지만 몇 가지 방법을 알고 있습니다. 자신의 열 유형을 정의하여이를 제한하거나 DataGridView 이벤트를 처리 할 수 ​​있습니다.

여기를보세요 : http://msdn.microsoft.com/en-us/library/wc5cbb9z.aspx

특히 : CellValidatingCellValueChanged

0

당신은 또한 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; 
     } 
    } 
} 
+0

이와 관련하여 상당한 성능 저하가있을 것으로 생각하십니까? 만약 그가'CellValidating' 이벤트를 처리한다면 그는 찾고 있던 컬럼과 일치하는'ColumnIndex'의 원하는 타입으로 값을'TryCast' 할 수 있습니다. 이렇게하면 사용자가'TextBoxColumn'의 행을 입력 할 때마다 이벤트가 추가/제거되지 않습니다. 대신 사용자가 데이터 입력을 완료하면 하나의 확인을 수행합니다. 또한 추가 열에 유사한 제한이 필요한 경우 더 적은 코드가 필요하고 관리가 쉬울 것입니다. – Origin

+0

상당한 성능 저하는 없습니다. 편집 컨트롤에서 유효성 검사를 수행하면 얻는 주된 이점은 셀에 잘못된 값이 입력되는 것을 방지 할 수 있다는 것입니다. –