【问题标题】:How to only show xml attributes that are not optional? In C#如何仅显示非可选的 xml 属性?在 C# 中
【发布时间】:2011-03-24 12:18:30
【问题描述】:

我只想在 C# 中显示来自 XML 文件的非可选数据,但我以前从未使用过它,而且我是序列化方法的新手。

我有一个 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 中的某个项目时,我会看到一个包含所有属性的编辑屏幕):

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);
                }
            }
        }

【问题讨论】:

    标签: c# xml serialization xml-serialization


    【解决方案1】:

    对于可选字段,您需要使用可为空的类型(见下文)并转换为字符串,因为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) ;
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-19
      • 2011-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-15
      相关资源
      最近更新 更多