开发者

How to only show xml attributes that are not optional? In C#

I want to only show non-optional data from an XML file in C# but I've never used it before and I'm new in the serialization method.

I've got an XSD with:

  <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"/>

And I have a FillEditWindow() statement where I dynamically make labels and textboxes:

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.Nam开发者_如何学Ce = whatCategorieName;
                txt.Text = "";
            }

            EditControls.Children.Add(txt);
        }

Is it possible to check with an if statement if the attribute is optional or not?

Also if it is any help here is where I get my data from (when I click on a certain item in a TreeView I get an editscreen with all the attributes in it):

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


For optional fields you need to use a nullable type (see below) and translate to string since DateTime? cannot be represented as attribute. For mandatory ones, initialise them to empty string:

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜