1) Для вашего первого вопроса,
Ниже приведены модели классов для анализа вашего xml,
class Answer
{
public string Text { get; set; }
public bool Correct { get; set; }
}
class Question
{
public string Ques { get; set; }
public string Type { get; set; }
public List<Answer> Answers { get; set; }
}
class Tranzaction
{
public string TransactionId { get; set; }
public List<Question> Questions { get; set; }
}
. С помощью LINQ to XML вы можете анализировать ваши модели классов xml и выше, например,
XDocument doc = XDocument.Parse("Your xml text here");
List<Tranzaction> transactions = (from p in doc.Descendants("PlatformResponse")
select new Tranzaction
{
TransactionId = p?.Elements("TransactionDetails")?.FirstOrDefault()?.Element("TransactionId")?.Value.Trim(),
Questions = (from q in p?.Descendants("Questions")?.Elements("Question")
select new Question
{
Ques = q?.Attribute("text")?.Value,
Type = q?.Attribute("type")?.Value,
Answers = (from a in q?.Elements("Answer")
select new Answer
{
Text = a?.Value,
Correct = Convert.ToBoolean(a?.Attribute("correct")?.Value)
}).ToList()
}).ToList()
}).ToList();
2) Для вашего второго вопроса
Теперь вы можете создать один ObservableCollection
для результата запроса выше и связать это список в виде ксамарина, например
ObservableCollection<Tranzaction> tranzactionsOC = new ObservableCollection<Tranzaction>(transactions);
Теперь tranzactionsOC
- это ваш ObservableCollection
, и вы можете привязать его к форме ксамарина
Можно проверить значение EndDate в выражение параметра, и если это неправильно, установите его на StartDate + 1 Месяц.
Что-то как:
= IIF(DateDiff(DateInterval.Month, Parameters!StartDate.Value, Parameters!EndDate.Value) = 0, Parameters!EndDate.Value, AddDate(DateInterval.Month, 1, Parameters!StartDate.Value))
Если Вы просто хотите, уведомляют пользователя, можно поместить некоторое поле скрытого текста с соответствующим форматированием (красный крупный шрифт) и передать о параметрах даты неправильный диапазон. В Скрытом наборе выражения
= (DateDiff(DateInterval.Month, Parameters!StartDate.Value, Parameters!EndDate.Value) <> 0)
Кроме того, можно объединить оба действия с пользовательским кодом:
Public DateMessage As String
Public Function ValidateDate(StartDate As DateTime, EndDate As DateTime) As DateTime
Dim ResultDate As DateTime
If (DateDiff(DateInterval.Month, StartDate, EndDate) <> 0) Then
ResultDate = AddDate(DateInterval.Month, 1, StartDate)
DateMessage = String.Format("End Date parameter value {0}
was out of range and was changed to {1}", EndDate, ResultDate)
Else
ResultDate = EndDate
End If
End Function
Затем в выражении Значения параметра:
= Code.ValidateDate(Parameters!StartDate.Value, Parameters!EndDate.Value)
В свойстве Value tbDateParameterMessage текстового поля:
= Code.DateMessage
И в выражении свойства Hidden:
= String.IsNullOrEmpty(Code.DateMessage)
РЕДАКТИРОВАНИЕ, Но если Вы хотите остановить выполнение отчета, используйте этот пользовательский код:
Public Function CheckDate(SDate as Date, EDate as Date) as Integer
Dim msg as String
msg = ""
If (SDate > EDate) Then
msg="Start Date should not be later than End Date"
End If
If msg <> "" Then
MsgBox(msg, 16, "Parameter Validation Error")
Err.Raise(6,Report) 'Raise an overflow
End If
End Function
Это взято от форума SQLServerCentral.
Я использовал идею поля скрытого текста, потому что это было лучше, чем разрешение катастрофическому отказу отчета. То, что я надеялся выполнить, должно было вынудить пользователя изменить их параметры впереди перед выполняемым отчетом.
BTW, синтаксис не работал. Я использовал это вместо этого:
= Month(Parameters!begindate.Value) = Month(Parameters!enddate.Value) and Year(Parameters!begindate.Value) = Year(Parameters!enddate.Value)
Спасибо coldice для идеи.