2014-11-21 55 views
0

我試圖通過相應列的值類型來驗證datagridview的輸入,這是我的代碼:如何驗證c#中列值類型的datagridview輸入?

private void dgvLoadTable_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) 
{ 
    foreach (DataGridViewRow dr in dgvLoadTable.Rows) 
    { 
    foreach (DataGridViewCell dc in dr.Cells) 
    { 
     if (dc.GetType() == typeof(Int32) || dc.GetType() == typeof(Double))//if(dc.ColumnIndex==0) 
     { 
     DataGridViewTextBoxCell cell = dgvLoadTable[e.ColumnIndex, e.RowIndex] as DataGridViewTextBoxCell; 
     if (cell != null) 
     { 
     char[] chars = e.FormattedValue.ToString().ToCharArray(); 
     foreach (char c in chars) 
     { 
     if (char.IsDigit(c) == false) 
     { 
      MessageBox.Show("You have to enter digits only"); 
      e.Cancel = true; 
      break; 
     }} } 
      } 
     } 
     } 
    } 

但是這是行不通的,應該是什麼的一些列的類型?僅供參考,這是一個winForm應用程序,不同的數據通過用戶選擇在運行時在datagridview中加載。所以列以前不知道。 datagridview綁定到實體模型。

回答

0

首先,這取決於源集合中的數據類型。 所以它可能是十進制或其他一些數值。 最好如果你在這個方法中爲某個單元格(列)添加條件斷點。

此外,我會避免迭代通過每行anc列,因爲此方法被稱爲特定單元格。

因此,您可能希望通過使用e.RowIndex和e.ColumnIndex從數據源中提取單元格數據對象,而不是對行/單元格進行foreach,您可能希望通過e.RowIndex和e.ColumnIndex獲取單元格的確切數據。

我SRC看起來是對象的列表:初始化這樣

class TestData 
{ 
    public Decimal Value { get; set; } 
    public string Name { get; set; } 
} 

List<TestData> src = new List<TestData>(); 
src.Add(new TestData() { Name = "Test 1", Value = 10 }); 
src.Add(new TestData() { Name = "Test 2", Value = 20 }); 
dataGridView1.DataSource = src; 

而且我的測試,可以在這裏完成:

private void dataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) 
    { 
     var row = dataGridView1.Rows[e.RowIndex]; 
     if (null != row) 
     { 
      var cell = row.Cells[e.ColumnIndex]; 
      if (null != cell) 
      { 
       object value = cell.Value; 
       if (null != value) 
       { 
        // Do your test here in combination with columnindex etc 
       } 
      } 
     } 
    } 
+0

當然有很多種嘗試/檢查類型的方法。取決於你想要測試的是什麼, – SebSky 2014-11-21 14:10:44

+0

不能使用列索引或名稱,因爲哪個表將被加載到數據網格中是事先不知道的。我有10 +表,他們根據用戶選擇加載。 – Paradox 2014-11-21 14:35:53

+0

是的,但使用上面你正在驗證某些單元格不是整個表...然後,您可以使用http://stackoverflow.com/a/894296/4123158檢查值是否爲「數字」 – SebSky 2014-11-24 09:36:31

0
private void dataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) 
    { 
     foreach (DataGridViewRow dr in dataGridView1.Rows) 
     { 
      foreach (DataGridViewCell dc in dr.Cells) 
      { 
       int x; 
       double y; 
       if (int.TryParse(dc.Value.ToString(),out x) || double.TryParse(dc.Value.ToString(),out y)) 
       { 
        MessageBox.Show("You have to enter digits only"); 
       } 

      } 
     } 
    } 

我希望這可以幫助你。我建議你使用tryparse函數來查看輸入的值是否是數字。您也可以將此函數用於DataGridView_CellValueChanged函數。

+0

這是給我例外 - 運行程序時,對象引用未設置爲對象的實例。 – Paradox 2014-11-21 14:38:02

0

對不起,關於最後一個,這是一個新的代碼塊。我試過它的工作。

private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e) 
    { 
     int x; 

     if (this.Visible && !int.TryParse(dataGridView1[e.ColumnIndex, e.RowIndex].Value.ToString(), out x)) 
     { 
      MessageBox.Show("You have to enter digits only"); 
      dataGridView1[e.ColumnIndex, e.RowIndex].Value = ""; 
     } 
    }