我需要知道是否可以在DataGrid中禁用特定的单元格编辑,不用禁用Silverlight 4中整个列的编辑。我可以将特定的单元格对象作为FrameworkElement获取但是它不包含属性IsReadOnly或IsEnabled。 你可能会问:为什么我需要那个?我的应用程序需要根据其他单元格内容禁用行中的特定单元格。每行都以这种方式单独检查。 如果您知道如何实现这种不寻常的行为,请写下来;)
答案 0 :(得分:2)
您可以将IsReadOnly属性用于此类
的特定单元格 <DataGridTextColumn Header="ID"
Binding="{Binding ID}"
IsReadOnly="True"/>
我认为这是禁用特定单元格的最佳选择。 谢谢
答案 1 :(得分:1)
如果您有要禁用的单元格/单元格的行,列索引:
int r = 2, c = 4;
然后您可以收听CellEnter和CellLeave事件并执行以下操作:
private void dataGridView1_CellEnter(object sender, DataGridViewCellEventArgs e)
{
if (e.RowIndex == r)
{
if (e.ColumnIndex == c)
{
dataGridView1.Columns[e.ColumnIndex].ReadOnly = true;
}
}
}
private void dataGridView1_CellLeave(object sender, DataGridViewCellEventArgs e)
{
if (e.RowIndex == r)
{
if (e.ColumnIndex == c)
{
dataGridView1.Columns[e.ColumnIndex].ReadOnly = false;
}
}
}
您仍然将整个列设置为Readonly,但由于您在离开单元格后将其重置为它,因此它的效果似乎只适用于单元格。
答案 2 :(得分:0)
感谢NominSim,这也帮助我解决了我的问题,但是作为神经症 在SilverLight 4中的DataGrid上找不到CellEnter和CellLeave方法。
正如NominSim所说,你需要知道行和列的索引。
我如何解决它:
禁用修改
System.Windows.Threading.DispatcherTimer timMakeEditable = new System.Windows.Threading.DispatcherTimer();
private void dataGrid1_PreparingCellForEdit(object sender, DataGridPreparingCellForEditEventArgs e)
{
timMakeEditable.Interval = new TimeSpan(0, 0, 0, 0, 100); // 100 Milliseconds
timMakeEditable.Tick += new EventHandler(timer_Tick);
timMakeEditable.Start();
if (e.RowIndex == r && e.ColumnIndex == c)
{
dataGrid1.Columns[yourColumnIndex].IsReadOnly = true;
}
}
启用修改
在几毫秒后,计时器启用了列:
void timer_Tick(object sender, EventArgs e)
{
dataGrid1.Columns[yourColumnIndex].IsReadOnly = false;
timMakeEditable.Stop();
}
我认为使用cellEditEnded是一个更好的主意,但它对我没用。