我有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;
}
}
}
似乎没有像我想的那样工作
答案 0 :(得分:0)
在datagridview中查看CellValidating
和CellEndEdit
个事件。使用它们,您可以将一些验证逻辑放入网格的单元格中,例如,使用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;
}
}