2011-03-24 58 views
2

我想只显示来自C#中的XML文件的非可选数据,但我从来没有使用过它,我是序列化方法中的新成员。如何仅显示不是可选的xml属性?在C#中

我有与XSD:

<xs:attribute name="SpecialtyCd" type="xs:string" /> 
    <xs:attribute name="DoctorUid" type="xs:string" /> 
    <xs:attribute name="ValidFrom" type="xs:date" use="optional"/> 
    <xs:attribute name="ValidUntil" type="xs:date" use="optional"/> 

而且我有一个FillEditWindow()语句,我做动态标签和文本框:

private void FillEditWindow(PropertyInfo p, object dc, Type t) 
{ 
    object[] attributes = p.GetCustomAttributes(true);   

    bool ignore = attributes.Any(a => a.ToString().Contains("XmlIgnoreAttribute")); 
    if (!ignore) 
    { 
     Label lbl = new Label(); 

     whatCategorieName = p.Name; 

     var whatCategorieSource = p.GetValue(dc, null); 
     lbl.Content = whatCategorieName + ':'; 
     lbl.FontFamily = new FontFamily("Verdana"); 
     lbl.FontWeight = FontWeights.Bold; 
     lbl.Width = 400; 

     EditControls.Children.Add(lbl); 

     //Check if Date// 
     if (p.PropertyType == typeof(DateTime)) 
     { 
      DatePicker datePicker = new DatePicker(); 
      datePicker.Name = whatCategorieName; 
      datePicker.Width = 400; 
      DateTime dateSource = DateTime.Parse(whatCategorieSource.ToString()); 

      if (dateSource.ToString() != "1/01/0001 0:00:00") 
      { 
       datePicker.SelectedDate = dateSource; 
      } 

      datePicker.DisplayDateStart = new DateTime(1980, 1, 1); 
      datePicker.DisplayDateEnd = new DateTime(2050, 12, 31); 
      datePicker.FirstDayOfWeek = DayOfWeek.Monday; 

      EditControls.Children.Add(datePicker); 
     } 
     //Check if Boolean 
     else if (p.PropertyType == typeof(Boolean)) 
     { 
      Boolean trueOrFalse = Convert.ToBoolean(whatCategorieSource); 

      CheckBox boxTrueOrFalse = new CheckBox(); 
      boxTrueOrFalse.Name = whatCategorieName; 
      boxTrueOrFalse.Width = 400; 

      EditControls.Children.Add(boxTrueOrFalse); 

      //Check if true or false 
      if (trueOrFalse == true) 
      { 
       boxTrueOrFalse.IsChecked = true; 
      } 
      else if (trueOrFalse == false) 
      { 
       boxTrueOrFalse.IsChecked = false; 
      } 
     } 
     //Check if String 
     else if (p.PropertyType == typeof(string)) 
     { 
      TextBox txt = new TextBox(); 
      txt.Width = 400; 

      if (whatCategorieSource != null) 
      { 
       txt.Name = whatCategorieName; 
       txt.Text = whatCategorieSource.ToString(); 
      } 
      else 
      { 
       txt.Name = whatCategorieName; 
       txt.Text = ""; 
      } 

      EditControls.Children.Add(txt); 
     } 

是否有可能检查使用if声明该属性是否可选?

而且如果是任何帮助这里就是我从获得我的数据(当我在一个TreeView点击某一个项目,我得到一个editscreen与它的所有属性):

private void TextBlock_PreviewMouseDown(object sender, MouseButtonEventArgs e) 
{ 
    var dc = ((FrameworkElement)e.OriginalSource).DataContext; 

    selectedItemHosp = null; 
    selectedItemList = null; 
    selectedItemExamDef = null; 

    if (dc != null && dc is HospitalWrapper) 
    { 
     if (dc is HospitalWrapper && !((HospitalWrapper)dc).IsTitle) 
     { 
      var context = ((HospitalWrapper)dc).Context; 
      selectedItemHosp = (HospitalWrapper)dc; 

      canSave = true; 
      string edit = ((TextBlock)sender).Text.ToString(); 
      labelEdit.Text = ((TextBlock)sender).Text.ToString(); 

      Type t = context.GetType(); 
      PropertyInfo[] pi = t.GetProperties();     

      EditControls.Children.Clear(); 
      EditControlsLayout.Visibility = Visibility.Visible; 

      sourceOfEdit = "Hospitals"; 

      //Change Data 
      foreach (PropertyInfo p in pi) 
      { 
       if (p.PropertyType == typeof(string) || p.PropertyType == typeof(DateTime) || p.PropertyType == typeof(Boolean)) 
       { 
        FillEditWindow(p, context, t); 
       } 
      } 
     } 

回答

2

对于可选字段需要使用可空类型(见下文)并转换为字符串,因为DateTime?不能表示为属性。对于必填项,请将它们初始化为空字符串:

public class MyClass 
{ 

    public MyClass() 
    { 
     SpecialtyCd = string.Empty; 
     DoctorUid = string.Empty; 
    } 

    [XmlAttribute] 
    public string SpecialtyCd { get; set; } 

    [XmlAttribute] 
    public string DoctorUid { get; set; } 

    [XmlIgnore] 
    public DateTime? ValidFrom { get; set; } 

    [XmlIgnore] 
    public DateTime? ValidUntil { get; set; } 

    [XmlAttribute("ValidUntil")] 
    public string ValidUntilString 
    { 
     get { return ValidUntil.HasValue ? ValidUntil.Value.ToString() : null; } 
     set 
     { 
      ValidUntil = value== null ? (DateTime?) null : DateTime.Parse(value) ; 
     } 
    } 

    [XmlAttribute("ValidFrom")] 
    public string ValidFromString 
    { 
     get { return ValidFrom.HasValue ? ValidFrom.Value.ToString() : null; } 
     set 
     { 
      ValidFrom = value== null ? (DateTime?) null : DateTime.Parse(value) ; 
     } 
    } 
} 
相关问题