Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 应用程序启动时ValidationError上的XamlParseException_C#_Wpf_Xaml_Data Binding_Validation - Fatal编程技术网

C# 应用程序启动时ValidationError上的XamlParseException

C# 应用程序启动时ValidationError上的XamlParseException,c#,wpf,xaml,data-binding,validation,C#,Wpf,Xaml,Data Binding,Validation,我创建了一个WPF应用程序,其中绑定了一些文本框。 我使用验证错误来检查值是否正确。验证程序搜索数据库,以查看输入的数据是否存在 如果输入的值为false,则验证错误会捕获错误whitot问题:) 然而,如果我输入了一个好的值,如果我关闭我的应用程序,继续我的数据库删除该值,当我重新启动我的应用程序时,会加载最新的数据,这里…我有一个很好的崩溃:“XamlParseException” 此异常是因为我删除了数据中的一个值,并且在验证查找我的数据库时,找不到该数据 我不明白为什么我在发射时会坠毁,

我创建了一个WPF应用程序,其中绑定了一些文本框。 我使用验证错误来检查值是否正确。验证程序搜索数据库,以查看输入的数据是否存在

如果输入的值为false,则验证错误会捕获错误whitot问题:)

然而,如果我输入了一个好的值,如果我关闭我的应用程序,继续我的数据库删除该值,当我重新启动我的应用程序时,会加载最新的数据,这里…我有一个很好的崩溃:“XamlParseException”

此异常是因为我删除了数据中的一个值,并且在验证查找我的数据库时,找不到该数据

我不明白为什么我在发射时会坠毁,但不是在发射后

以下是我的验证示例:

    private string m_strCodeIntervenant;
    public string strCodeIntervenant
    {
        get { return m_strCodeIntervenant; }
        set
        {
            m_strCodeIntervenant = value;
            if (m_strCodeIntervenant.Trim() != "")
            {
                if (m_objIntervenant.ReadIntervenantCodebyCode(m_strCodeIntervenant) != 0)
                {
                    throw new ApplicationException(m_strCodeIntervenant.Trim() + " don't exist !");
                }
                FirePropertyChangedEvent("strCodeIntervenant");
            }
            else
            {
                m_objIntervenant.strNom = "";
                m_objIntervenant.strIntervenant = "";
            }
            FirePropertyChangedEvent("objIntervenant.strNom");
        }
    }
public partial class MainWindow : Window
{

    private void InitialiserControles()
    {
        TextBox_Description.Text = string.Empty;
        TextBox_EvtNum.Text = string.Empty;
        TimePicker_Heure.Value = null;
        TextBox_Intervenant.Text = string.Empty;
        TextBox_TypeEvenement.Text = string.Empty;
        TextBloc_Note.Text = string.Empty;
        DateTimePicker_Date.SelectedDate = DateTime.Today;
        DateTimePicker_Relance.SelectedDate = null ;
    }

    public ObservableCollection<Evenement> Collection_Evenements = new ObservableCollection<Evenement>();
    Evenement myEvenement = new Evenement();

    private void MettreAJourTableauEvenements()
    {
        Collection_Evenements = myEvenement.GetEvenementsForCliCode(App.obj_myClient.m_strCode);
        Collection_Evenements.CollectionChanged += Collection_Evenements_CollectionChanged;
        myDataGridEvenements.ItemsSource = Collection_Evenements;
    }

    public MainWindow()
    {
            InitializeComponent();

            this.DataContext = App.obj_myEvenement;

            //Load Evenement in DataGrid
            MettreAJourTableauEvenements();

    }


    private void myDataGridEvenements_SelectedCellsChanged_1(object sender, SelectedCellsChangedEventArgs e)
    {
        // Affiche le code évt sélectionné dans le tableau, dans les champs modifiable ( en haut de l'écran )

        var item = myDataGridEvenements.SelectedItem as Evenement;         
        if ((item != null))
        {
            App.obj_myEvenement.ReadEvenementebyNumero(item.strEvtNumero);
            TextBox_Description.Text = item.strDesignation;
            TextBox_EvtNum.Text = item.strEvtNumeroString;
            TextBox_Intervenant.Text = item.strCodeIntervenant;
            TextBox_TypeEvenement.Text = item.strEvtType;
            TextBloc_Note.Text = item.strNote;
            DateTimePicker_Date.SelectedDate = Evenement.ConvertToDateTimePicker(item.dDate);
            DateTimePicker_Relance.SelectedDate = Evenement.ConvertToDateTimePicker(item.dDateRelance);
            TimePicker_Heure.Value = item.dDate;
        }
    }

    private void Collection_Evenements_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    {
        if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Remove)
        {
            (e.OldItems[0] as Evenement).SupprimeEvenement();
            InitialiserControles();
        }
    }

    private void Window_Loaded_1(object sender, RoutedEventArgs e)
    {

        myDataGridEvenements.Focus();
        myDataGridEvenements.SelectedIndex = 0;
        myDataGridEvenements.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));

        Lbl_CliCodeCliDes.Content = App.obj_myClient.m_strCode.Trim() + " - " + App.obj_myClient.m_strNom.Trim();
        Lbl_CliCPostalVille.Content = App.obj_myClient.m_strCodePostal.Trim() + " - " + App.obj_myClient.m_strVille.Trim(); 

        App.obj_Parametres.LoadDataGridParams(myDataGridEvenements);

    }


    private bool IsValid(DependencyObject obj)
    {
        // return false;
        // The dependency object is valid if it has no errors, 
        //and all of its children (that are dependency objects) are error-free.
        return !Validation.GetHasError(obj)&&
        !LogicalTreeHelper.GetChildren(obj)
        .OfType<DependencyObject>()
        .Any(child => !IsValid(child));
    }


}
以下是我的验证XAML:

<TextBox Grid.Column="1" Name="TextBox_Intervenant" TabIndex="2" VerticalAlignment="Center" Height="20" >
    <TextBox.Text>
        <Binding Path="strCodeIntervenant" >
            <Binding.ValidationRules>
                <ExceptionValidationRule />
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>


---------

<Style TargetType="{x:Type TextBox}">
    <Setter Property="Validation.ErrorTemplate">
        <Setter.Value>
            <ControlTemplate>
                <DockPanel LastChildFill="True">
                    <TextBlock Margin="50,0,0,0" DockPanel.Dock="Right"
                    Foreground="Red"
                    FontSize="10pt"
                    Text="{Binding ElementName=MyAdorner,Path=AdornedElement.(Validation.Errors)[0].ErrorContent}">
                    </TextBlock>
                    <Border BorderBrush="Red" BorderThickness="1">
                        <AdornedElementPlaceholder Name="MyAdorner" />
                    </Border>
                </DockPanel>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

---------
这是我的XAML.cs(为了更好地查看,稍微清理一下):

    private string m_strCodeIntervenant;
    public string strCodeIntervenant
    {
        get { return m_strCodeIntervenant; }
        set
        {
            m_strCodeIntervenant = value;
            if (m_strCodeIntervenant.Trim() != "")
            {
                if (m_objIntervenant.ReadIntervenantCodebyCode(m_strCodeIntervenant) != 0)
                {
                    throw new ApplicationException(m_strCodeIntervenant.Trim() + " don't exist !");
                }
                FirePropertyChangedEvent("strCodeIntervenant");
            }
            else
            {
                m_objIntervenant.strNom = "";
                m_objIntervenant.strIntervenant = "";
            }
            FirePropertyChangedEvent("objIntervenant.strNom");
        }
    }
public partial class MainWindow : Window
{

    private void InitialiserControles()
    {
        TextBox_Description.Text = string.Empty;
        TextBox_EvtNum.Text = string.Empty;
        TimePicker_Heure.Value = null;
        TextBox_Intervenant.Text = string.Empty;
        TextBox_TypeEvenement.Text = string.Empty;
        TextBloc_Note.Text = string.Empty;
        DateTimePicker_Date.SelectedDate = DateTime.Today;
        DateTimePicker_Relance.SelectedDate = null ;
    }

    public ObservableCollection<Evenement> Collection_Evenements = new ObservableCollection<Evenement>();
    Evenement myEvenement = new Evenement();

    private void MettreAJourTableauEvenements()
    {
        Collection_Evenements = myEvenement.GetEvenementsForCliCode(App.obj_myClient.m_strCode);
        Collection_Evenements.CollectionChanged += Collection_Evenements_CollectionChanged;
        myDataGridEvenements.ItemsSource = Collection_Evenements;
    }

    public MainWindow()
    {
            InitializeComponent();

            this.DataContext = App.obj_myEvenement;

            //Load Evenement in DataGrid
            MettreAJourTableauEvenements();

    }


    private void myDataGridEvenements_SelectedCellsChanged_1(object sender, SelectedCellsChangedEventArgs e)
    {
        // Affiche le code évt sélectionné dans le tableau, dans les champs modifiable ( en haut de l'écran )

        var item = myDataGridEvenements.SelectedItem as Evenement;         
        if ((item != null))
        {
            App.obj_myEvenement.ReadEvenementebyNumero(item.strEvtNumero);
            TextBox_Description.Text = item.strDesignation;
            TextBox_EvtNum.Text = item.strEvtNumeroString;
            TextBox_Intervenant.Text = item.strCodeIntervenant;
            TextBox_TypeEvenement.Text = item.strEvtType;
            TextBloc_Note.Text = item.strNote;
            DateTimePicker_Date.SelectedDate = Evenement.ConvertToDateTimePicker(item.dDate);
            DateTimePicker_Relance.SelectedDate = Evenement.ConvertToDateTimePicker(item.dDateRelance);
            TimePicker_Heure.Value = item.dDate;
        }
    }

    private void Collection_Evenements_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    {
        if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Remove)
        {
            (e.OldItems[0] as Evenement).SupprimeEvenement();
            InitialiserControles();
        }
    }

    private void Window_Loaded_1(object sender, RoutedEventArgs e)
    {

        myDataGridEvenements.Focus();
        myDataGridEvenements.SelectedIndex = 0;
        myDataGridEvenements.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));

        Lbl_CliCodeCliDes.Content = App.obj_myClient.m_strCode.Trim() + " - " + App.obj_myClient.m_strNom.Trim();
        Lbl_CliCPostalVille.Content = App.obj_myClient.m_strCodePostal.Trim() + " - " + App.obj_myClient.m_strVille.Trim(); 

        App.obj_Parametres.LoadDataGridParams(myDataGridEvenements);

    }


    private bool IsValid(DependencyObject obj)
    {
        // return false;
        // The dependency object is valid if it has no errors, 
        //and all of its children (that are dependency objects) are error-free.
        return !Validation.GetHasError(obj)&&
        !LogicalTreeHelper.GetChildren(obj)
        .OfType<DependencyObject>()
        .Any(child => !IsValid(child));
    }


}
公共部分类主窗口:窗口
{
私有void initialiserControls()
{
TextBox_Description.Text=string.Empty;
TextBox_EvtNum.Text=string.Empty;
TimePicker_Heure.Value=null;
TextBox\u Intervenant.Text=string.Empty;
TextBox_typeevennement.Text=string.Empty;
TextBloc_Note.Text=string.Empty;
DateTimePicker\u Date.SelectedDate=DateTime.Today;
DateTimePicker\u Relance.SelectedDate=null;
}
公共ObservableCollection_events=新ObservableCollection();
晚上我的聚会=新的晚上();
私人无效会议
{
Collection\u events=myEvenement.GetEvenementsForCliCode(App.obj\u myClient.m\u strCode);
Collection\u events.CollectionChanged+=Collection\u events\u CollectionChanged;
MyDataGridEvenments.ItemsSource=集合\u Evenments;
}
公共主窗口()
{
初始化组件();
this.DataContext=App.obj_myEvenement;
//数据网格中的负载均衡
MettreaJournatablueVenements();
}
私有void MyDataGridEvents\u SelectedCellsChanged\u 1(对象发送方,SelectedCellsChangedEventArgs e)
{
//在表格上标注代码和选择,并在表格上标注可修改的champs(上莱克兰)
var item=MyDataGridEvenments.SelectedItem作为Evenments;
如果((项!=null))
{
附录obj_myEvenement.ReadEvenmenteBynumero(项目strEvtNumero);
TextBox_Description.Text=item.strDesignation;
TextBox_EvtNum.Text=item.strevtnumering;
TextBox\u Intervenant.Text=item.strcodeinventerant;
TextBox_typeevennement.Text=item.strEvtType;
Text bloc_Note.Text=item.strNote;
DateTimePicker\u Date.SelectedDate=evement.ConvertToDateTimePicker(item.dDate);
DateTimePicker\u Relance.SelectedDate=evement.ConvertToDateTimePicker(item.dDateRelance);
TimePicker_Heure.Value=item.dDate;
}
}
私有无效集合\u events\u CollectionChanged(对象发送方,System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
if(e.Action==System.Collections.Specialized.NotifyCollectionChangedAction.Remove)
{
(e.旧项目[0]作为晚上)。供应会议();
InitializerControls();
}
}
私有无效窗口\u加载\u 1(对象发送方,路由目标)
{
myDataGridEvenments.Focus();
MyDataGridEvents.SelectedIndex=0;
MoveFocus(新的遍历请求(FocusNavigationDirection.Next));
Lbl_CliCodeCliDes.Content=App.obj_myClient.m_strCode.Trim()+“-”+App.obj_myClient.m_strNom.Trim();
Lbl_CliCPostalVille.Content=App.obj_myClient.m_strCodePostal.Trim()+“-”+App.obj_myClient.m_strVille.Trim();
App.obj_参数LoadDataGridParams(MyDataGridEvents);
}
私有布尔值有效(DependencyObject对象)
{
//返回false;
//如果依赖项对象没有错误,则该对象有效,
//它的所有子对象(即依赖对象)都是无错误的。
return!Validation.GetHasError(obj)&&
!LogicalTreeHelper.GetChildren(obj)
第()类
.Any(child=>!IsValid(child));
}
}
此崩溃发生在生产“发布”或“调试模式”中

该异常是一个XamlParseException,InnerException={“TELOU不存在!”} 异常不会在文本框(警告标签)旁边显示“TELOU不存在”,而是不会引发

有人有什么想法吗

非常感谢:)

致以最良好的祝愿


Nixeus

作为急救,请订阅dispatcher unhandle exception(最好在App.xaml.cs中)

Msdn链接-

这将帮助您记录崩溃信息

尝试使用此方法对启用验证的文本框进行模板化


定义
m\u strcodeintervent
字段的类的构造函数可能遇到崩溃。可能有东西正在使用以前缓存的“good”值,并通过直接设置字段绕过验证


在那里设置断点并分析发生的情况。

XAML不显示异常,仅在输出窗口中显示

您的代码正在抛出错误,但仅显示在输出窗口中

当异常在控件的init上时,它无法处理并破坏应用程序


不要自己抛出异常来处理错误。

如果应用程序崩溃,那么您应该得到一个异常。把它也发出去也会有帮助的。我是编辑