如何获取WPF的DataGrid控件中,是否存在没有通过错误验证的Cell

粗暴的香蕉 2011-05-21 06:28:15
在WPF使用DataGrid从数据库中读取数据给用户编辑,编辑完后触发验证,如果例如验证输入的值一定要是整数。
验证失败会设置该Cell的样式以提示用户,并且该Cell一直处于编辑状态,并且不能对其他Cell进行编辑。
以上功能通过下面的XAML实现了
<DataGridTextColumn Header="区间通过时间" Binding="{Binding itv_time, ValidatesOnExceptions=True}" EditingElementStyle="{StaticResource cellErrorStyle}" 
Width="Auto" CanUserResize="False"></DataGridTextColumn>


现在的问题是,窗口中同时有一个提交的按钮,在存在没有通过验证的Cell时,用户仍然是可以点击那个提交按钮的,这样会把错误的数据提交上去。
想实现的是在点击提交按钮的时候,能够根据DataGrid是否有存在没有通过验证的Cell,有就取消提交操作,直至DataGrid中所有的数据都是通过验证的才能执行提交。
请问应该怎么做?
...全文
894 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Apenghui919 2011-12-20
  • 打赏
  • 举报
回复
你好!
在WPF使用DataGrid从数据库中读取数据给用户编辑,编辑完后触发验证,如果例如验证输入的值一定要是整数。
验证失败会设置该Cell的样式以提示用户,并且该Cell一直处于编辑状态,并且不能对其他Cell进行编辑。

你做的验证是ValidatesOnExceptions ,基于异常的,如果改成ValidatesOnDataErrors 这是基于实现IDataErrorInfo接口的。就实现不了C该ell一直处于编辑状态,并且不能对其他Cell进行编辑
wangye2008 2011-10-22
  • 打赏
  • 举报
回复

/// <summary>
/// 获取DataGrid的所有行是否存在验证错误。
/// </summary>
/// <param name="dg">要检查的DataGrid实例</param>
/// <returns>true 有错,false 无错</returns>
public static bool GetDataGridRowsHasError(DataGrid dg)
{
bool hasError = false ;
for (int i = 0; i < dg.Items.Count; i++)
{
DependencyObject o = dg.ItemContainerGenerator.ContainerFromIndex(i);
hasError = Validation.GetHasError(o);
if (hasError)
{
break;
}
}
return hasError;
}

判断有验证错误 就不执行提交。


/// <summary>
/// 获取DataGrid的第一个被发现的验证错误结果。
/// </summary>
/// <param name="dg">被检查的DataGrid实例。</param>
/// <returns>错误结果。</returns>
public static ValidationError GetDataGridRowsFirstError(DataGrid dg)
{
ValidationError err=null;
for (int i = 0; i < dg.Items.Count; i++)
{
DependencyObject o = dg.ItemContainerGenerator.ContainerFromIndex(i);
bool hasError = Validation.GetHasError(o);
if (hasError)
{
err = Validation.GetErrors(o)[0];
break;
}
}
return err;
}

/// <summary>
/// 执行检查DataGrid,并提示第一个错误。重新定位到错误单元格。
/// </summary>
/// <param name="dg">被检查的DataGrid实例。</param>
/// <returns>true 有错并定位,false 无错、返回</returns>
public static bool ExcutedCheckedDataGridValidation(DataGrid dg)
{
ValidationError err = GetDataGridRowsFirstError(dg);
if (err != null)
{
string errColName = ((System.Windows.Data.BindingExpression)err.BindingInError).ParentBinding.Path.Path;
DataGridColumn errCol = dg.Columns.Single(p =>
{
if (((Binding)((DataGridTextColumn)p).Binding).Path.Path == errColName)
return true;
else return false;
});
//string errRow = ((DataRowView)((System.Windows.Data.BindingExpression)err.BindingInError).DataItem)["SWH"].ToString();
//dg.Items.IndexOf(((System.Windows.Data.BindingExpression)err.BindingInError).DataItem);
dg.SelectedItem = ((System.Windows.Data.BindingExpression)err.BindingInError).DataItem;
int errRowIndex = dg.SelectedIndex;
MessageBox.Show(string.Format("第\"{0}\"行 的\"{1}\"列的单元格数据不合法(以红色标出),请填写正确后再执行其他操作。", errRowIndex + 1, errCol.Header), "系统消息", MessageBoxButton.OK, MessageBoxImage.Warning);

dg.CurrentCell = new DataGridCellInfo(dg.SelectedItem, errCol);
if (!((DataRowView)dg.CurrentItem).IsEdit)
{
((DataRowView)dg.CurrentItem).BeginEdit();

}
TextBox txt = dg.CurrentColumn.GetCellContent(dg.CurrentItem) as TextBox;
txt.Focus();
return true;
}
else
{
return false;
}
}


这个用来重新定位到错误单元格
粗暴的香蕉 2011-05-21
  • 打赏
  • 举报
回复
怎么没人回答啊…………
粗暴的香蕉 2011-05-21
  • 打赏
  • 举报
回复
没有人能提供一下解决方法吗?
粗暴的香蕉 2011-05-21
  • 打赏
  • 举报
回复
补充一下吧
DataGrid里面我用了样式触发器
如下:

<DataGrid AutoGenerateColumns="False" Height="279" HorizontalAlignment="Left" Margin="6,6,0,0" Name="dgItv" VerticalAlignment="Top" Width="353" CellEditEnding="dgItv_CellEditEnding">
<DataGrid.Resources>
<Style x:Key="cellErrorStyle" TargetType="{x:Type TextBox}">
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="True">
<Setter Property="Background" Value="Red"></Setter>
<Setter Property="ToolTip" Value="请输入整数!"></Setter>
</Trigger>
</Style.Triggers>
</Style>
</DataGrid.Resources>
<DataGrid.Columns>
<DataGridTextColumn Header="区间表示" Binding="{Binding line_id}" Visibility="Hidden"></DataGridTextColumn>
<DataGridTextColumn Header="线路名" Binding="{Binding line_name}" Width="Auto" CanUserResize="False" IsReadOnly="True"></DataGridTextColumn>
<DataGridTextColumn Header="区间名" Binding="{Binding itv_name}" Width="*" CanUserResize="False" IsReadOnly="True"></DataGridTextColumn>
<DataGridTextColumn Header="区间通过时间" Binding="{Binding itv_time, ValidatesOnExceptions=True}" EditingElementStyle="{StaticResource cellErrorStyle}"
Width="Auto" CanUserResize="False"></DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>


我想在cellErrorStyle这个样式被ValidatesOnExceptions=True触发时,可以通知一个button设置它的IsEnalbed为false,通过验证后,设回true
内容概要:本文提出了一种面向通信优化的微电网分布式二次电压频率调控与功率均分方法,并通过Simulink平台进行了仿真实现。该方法针对孤岛微电网多分布式电源的协同控制问题,采用分布式控制架构以减少对央控制器的依赖,提升系统的可靠性与可扩展性。通过引入高效的通信机制与事件触发策略,在确保电压和频率快速精确恢复的同时,实现了各电源间有功与无功功率的均衡分配。文章详细阐述了控制算法的设计原理、稳定性分析过程以及关键参数的整定方法,并依托Simulink搭建完整的仿真模型,验证了所提方法在动态响应性能、抗干扰能力及通信资源利用率方面的优越性。; 适合人群:具备一定电力系统基础知识和仿真能力的研究生、科研人员及从事微电网、分布式能源系统相关工作的工程技术人员。; 使用场景及目标:①用于研究微电网分布式电源的协调控制策略;②适用于需要实现电压频率恢复与负载功率均分的实际微电网系统设计;③为应对通信资源受限场景下的控制优化提供解决方案;④作为教学案例帮助理解分布式控制与二次调控机制。; 阅读建议:建议结合Simulink仿真模型同步学习,重点关注控制结构设计与参数整定部分,同时可延伸阅读文提及的事件触发机制与弹性协同控制相关内容以加深理解。

111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧