如何只显示不可选的xml属性?在C#中

时间:2011-03-24 12:18:30

标签: c# xml serialization xml-serialization

我只想在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);
                }
            }
        }

1 个答案:

答案 0 :(得分: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) ;
        }
    }
}