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