【发布时间】:2011-05-31 01:35:10
【问题描述】:
每当用户单击行标题时,会选择整行(并将其突出显示为蓝色),实际输入的是第一列中的单元格。也就是说,如果您开始输入内容,则文本会进入该单元格。我想防止这种情况。选择一行或多行时是否可以不输入datagridview单元格?
我还需要一种解决方案,以防止在通过单击和拖动行标题导致的多行选择期间输入单元格。
关于如何实现这一目标的任何想法?
谢谢
艾萨克
【问题讨论】:
标签: c# datagridview
每当用户单击行标题时,会选择整行(并将其突出显示为蓝色),实际输入的是第一列中的单元格。也就是说,如果您开始输入内容,则文本会进入该单元格。我想防止这种情况。选择一行或多行时是否可以不输入datagridview单元格?
我还需要一种解决方案,以防止在通过单击和拖动行标题导致的多行选择期间输入单元格。
关于如何实现这一目标的任何想法?
谢谢
艾萨克
【问题讨论】:
标签: c# datagridview
将 DataGridView 的 ReadOnly 属性设置为 true 或 false,具体取决于是否选择了一行或多行,或者 DGV 的“CellState”是否已更改。
为您的 DataGridView 添加以下两个事件:
private void dataGridView1_RowStateChanged(object sender, DataGridViewRowStateChangedEventArgs e) {
if (e.StateChanged == DataGridViewElementStates.Selected) {
Console.WriteLine("TRUE");
dataGridView1.ReadOnly = true;
}
}
private void dataGridView1_CellStateChanged(object sender, DataGridViewCellStateChangedEventArgs e) {
if (e.StateChanged == DataGridViewElementStates.Selected) {
Console.WriteLine("false");
dataGridView1.ReadOnly = false;
}
}
这在我的测试中对我有用,但如果有隐藏的“陷阱”,我不会感到惊讶。
【讨论】:
另一种解决方案可能是这样的:
private void dataGrid_CellEnter(object sender, DataGridViewCellEventArgs e)
{
if (e.ColumnIndex == 0 && dataGrid.Rows[e.RowIndex].Selected)
return;
}
【讨论】:
CellEnter 事件。它不会自动停止单元格编辑。我找不到任何有用的方法从这个事件中离开牢房。例如,取消编辑或更改当前单元格的尝试不会产生预期的效果。
根据“Jay R”的回答,我稍微调整了代码,以免丢失单元格的只读标志。
private void dataGridView1_RowStateChanged(object sender, DataGridViewRowStateChangedEventArgs e)
{
if (e.StateChanged == DataGridViewElementStates.Selected)
e.Row.DataGridView.EditMode = DataGridViewEditMode.EditProgrammatically;
}
private void dataGridView1_CellStateChanged(object sender, DataGridViewCellStateChangedEventArgs e)
{
if (e.StateChanged == DataGridViewElementStates.Selected)
// adjust the edit mode to your "default" edit mode if you have to
e.Cell.DataGridView.EditMode = DataGridViewEditMode.EditOnEnter;
}
【讨论】: