не позволяйте пользователю выбирать значение в выпадающем списке в DataGridView, который уже был выбран - PullRequest
0 голосов
/ 09 марта 2011

У меня есть datagridview с 3 столбцами: Двигатель | TextBox | TextBox

Мой выпадающий список имеет некоторые значения Enums, из которых пользователь может выбирать.

и пользователь не может выбрать 1 значение из моего Enums более 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 голосов
/ 11 марта 2011

Вы также можете использовать более подход LINQish для уменьшения явного зацикливания. И проверка инвариантной культуры, чтобы убедиться, что выбранные ценности учитывают культуру ...

Возможно, вы могли бы сделать еще один шаг к выражениям LINQ и спрятать их за методами расширения для лучшей читабельности.

Но, что касается вопроса, в общем, вы определенно хотите быть в событиях 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;
    }
}
0 голосов
/ 09 марта 2011

См. CellValidating и CellEndEdit события в datagridview.С их помощью вы можете поместить некоторую проверочную логику в ячейку сетки и, например, предотвратить некоторые действия с ячейкой с e.Cancel = true;
. Чтобы увидеть, какие значения перечисления уже выбраны, вы можете добавить новый элемент List<int> selectedItems и проверить, если e.Значение (в обработчике события проверки ячейки) находится в этом списке.Если он уже есть - позвоните e.Cancel = true и добавьте текст подтверждения, если нет - добавьте его в список selecterItems.
Надежда поняла тебя правильно, и это поможет.Вы также можете прочитать msdn статью о проверке ячейки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...