2011-03-09 65 views
0

我有我的datagridview 3列: Motor | TextBox | TextBox不要让用户在已经选择的DataGridView中的组合框中选择一个值

我的组合框有一些用户可以从中选择的枚举值。

和用户倾斜允许从我的枚举选择1个值1倍以上..

希望maked我的问题很清楚:d

private void dataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) 
     { 
      for (int i = 0; i < dataGridView1.Rows.Count-1; i++) 
      { 
       if (dataGridView1.Rows[i].Cells[0].Value == e.FormattedValue) 
       { 
        MessageBox.Show("Value already selected"); 
        e.Cancel = true; 
       }     
      } 

     } 

不似乎工作像我将有它到

回答

0

请参阅CellValidatingCellEndEdit datagridview中的事件。使用它们,您可以将一些验证逻辑放入网格的单元格中,例如,通过e.Cancel = true;
可以防止对单元格执行某些操作要查看哪些枚举值已被选中,您可以添加新成员List<int> selectedItems并检查e.Value(单元格验证事件处理程序)在该列表中。如果它已经IS-调用e.Cancel = true并添加一些验证文本,如果它没有添加到selecterItems列表。
希望正确理解你,这将有所帮助。 你也可以看到msdn关于单元验证的文章。

+0

我想使2路的? foreach .. – DumaSexy 2011-03-09 09:18:14

+0

你可以这样写:'for(int i = 0; i 0x49D1 2011-03-09 10:01:29

+0

e.Value does not exit:S – DumaSexy 2011-03-09 10:16:38

0

您还可以使用更多LINQish方法来减少显式循环。而一个不变的文化检查,以确保值被选择文化考虑...

你可能可以采取更进一步的LINQ表达式,并将其隐藏在扩展方法以更好的可读性以及。

但对于这个问题,一般来说,你肯定想在CellValidatingCellEndEdit事件之前的状态。

下面是一些LINQish代码:

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 

     dataGridView1.Rows.Add(4); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     Column1.Items.Add("Item 1"); 
     Column1.Items.Add("item 1"); 
     Column1.Items.Add("Item 3"); 
    } 

    private void dataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) 
    { 
     var dataGrid = sender as DataGridView; 
     if (dataGrid == null) return; 

     var rowsWithComboValues = dataGrid.Rows.Cast<DataGridViewRow>().Where(row => row.Cells.Cast<DataGridViewCell>().First().Value != null); 
     if (rowsWithComboValues.Any(row => string.Compare(row.Cells[0].Value.ToString(), e.FormattedValue.ToString(), true, CultureInfo.InvariantCulture) == 0)) 
      e.Cancel = true; 
    } 
} 
相关问题