不要让用户在已经选择的DataGridView中选择组合框中的值

时间:2011-03-09 08:43:56

标签: c# winforms enums combobox

我有3列的datagridview: 电机| TextBox |文本框

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

并且用户不能允许从我的枚举中选择1个值超过1次..

希望我的问题足够明确: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;
                }                
            }

        }

似乎没有像我想的那样工作

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

您还可以使用更多LINQish方法来减少显式循环。并进行不变的文化检查,以确保所选择的价值观考虑到文化......

您可以将LINQ表达式更进一步,并将它们隐藏在Extension方法后面,以便提高可读性。

但至于问题,一般来说,你肯定希望以 CellValidating CellEndEdit 事件处于先前状态。

这是一些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;
    }
}