ПодробностиПросмотр значений ошибок

Вопрос:

Цель моего подробного обзора – собирать параметры отчета для пользователя, вводимого при запуске отчета. Поэтому я динамически создаю представление деталей, поскольку параметры отчета управляются данными, хранящиеся в базе данных в отчете. Объект, связанный с ним, создается динамически отражением во время выполнения из параметров отчета с одним свойством на каждый параметр, поэтому он содержит простые свойства даты или коллекции, которые я динамически изменяю в динамическом поле со списком или датой, динамически создавая шаблоны,

В событии item_updating я просто хочу получить значения, введенные пользователем, поэтому я знаю, как запускать отчет. Я просмотрел все свойства e, а также попытался findcontrol, чтобы получить значения, введенные пользователем. как e, так и findcontrol пустые. Вот как я получил данные в прошлом, поэтому я не знаю, почему их там нет. Это почти так, как если бы сами элементы управления не были представлены в объектной модели детального обзора того времени.

  <asp:DetailsView ID="DetailsView1" runat="server" AutoGenerateRows="false" DefaultMode="Edit" >
<Fields>
<asp:CommandField ButtonType="Button" UpdateText="Run" ShowCancelButton="false" ShowEditButton="true" />
</Fields>
</asp:DetailsView>

код за

  Private Sub BuildDetailView(DataSource As Object)


Dim Properties() As System.Reflection.PropertyInfo = DataSource.GetType.GetProperties
Dim Template As System.Web.UI.ITemplate
For Each PropertyInfo As System.Reflection.PropertyInfo In Properties
Template = Nothing
If PropertyInfo.PropertyType Is GetType(System.DateTime) Then
Template = New DateTemplate(DataSource, PropertyInfo)
ElseIf GetType(ICollection).IsAssignableFrom(PropertyInfo.PropertyType) Then
Template = New ListTemplate(DataSource, PropertyInfo, Report.InputReportParameters(Array.IndexOf(Properties, PropertyInfo)).Enumeration.MultiSelect)
End If
If Template IsNot Nothing Then
Dim TemplateField As New TemplateField
TemplateField.HeaderText = PropertyInfo.Name
TemplateField.ItemTemplate = Template
DetailsView1.Fields.Add(TemplateField)
End If
Next
End Sub

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
CheckAuthentication()

BuildDetailView(Report.ReportParametersDataObject)

If Report.ReportParameters.Any AndAlso Not Report.InputReportParameters.Any Then
Run() 'no parameters are for data entry

ElseIf Not IsPostBack Then
lblReportType.Text = String.Format("Report {0}", Report.Type)
DetailsView1.DataSource = New List(Of Object) From {Report.ReportParametersDataObject}
DetailsView1.DataBind()
End If
End Sub

Protected Sub DetailsView1_ItemUpdating(sender As Object, e As System.Web.UI.WebControls.DetailsViewUpdateEventArgs) Handles DetailsView1.ItemUpdating
Run(e.NewValues)
End Sub

Помощник списка шаблонов:

Public Class ListTemplate
Implements System.Web.UI.ITemplate

Public Sub New(DataSource As Object, PropertyInfo As System.Reflection.PropertyInfo, Multiselect As Boolean)
Me.DataSource = DataSource
Me.PropertyInfo = PropertyInfo
Me.Multiselect = Multiselect
End Sub

Private DataSource As Object
Private Multiselect As Boolean
Private PropertyInfo As System.Reflection.PropertyInfo

Public Sub InstantiateIn(container As System.Web.UI.Control) Implements System.Web.UI.ITemplate.InstantiateIn
Dim ListBox As New System.Web.UI.WebControls.ListBox
ListBox.DataSource = PropertyInfo.GetValue(DataSource, Nothing)
ListBox.DataTextField = "Text"
ListBox.DataValueField = "Value"
ListBox.SelectionMode = IIf(Multiselect, ListSelectionMode.Multiple, ListSelectionMode.Single)
ListBox.Rows = Math.Min(25, ListBox.DataSource.count)
ListBox.EnableViewState = True
container.Controls.Add(ListBox)
End Sub
End Class

Помощник DateTemplate:

Public Class DateTemplate
Implements System.Web.UI.ITemplate

Public Sub New(DataSource As Object, PropertyInfo As System.Reflection.PropertyInfo)
Me.DataSource = DataSource
Me.PropertyInfo = PropertyInfo
End Sub

Private DataSource As Object
Private PropertyInfo As System.Reflection.PropertyInfo

Public Sub InstantiateIn(container As System.Web.UI.Control) Implements System.Web.UI.ITemplate.InstantiateIn
Dim Textbox As New System.Web.UI.WebControls.TextBox
Textbox.ID = PropertyInfo.Name.Replace(" ", String.Empty)
Textbox.EnableViewState = True
Dim CalendarExtender As New AjaxControlToolkit.CalendarExtender
CalendarExtender.TargetControlID = Textbox.ID
CalendarExtender.SelectedDate = PropertyInfo.GetValue(DataSource, Nothing)
CalendarExtender.DefaultView = AjaxControlToolkit.CalendarDefaultView.Months
CalendarExtender.Format = "MMMM yyyy"
container.Controls.Add(Textbox)
container.Controls.Add(CalendarExtender)
End Sub
End Class

Лучший ответ:

В отсутствие каких-либо ответов или даже комментариев я работал над этой проблемой, создав собственный собственный пользовательский контроль asp.net.

Принцип работы очень прост. Он имеет свойство DataSource и создает пользовательский интерфейс, добавляющий виджет редактирования для каждого свойства. В соответствии с свойством propertyinfo.propertytype он создает редактор для этого типа.

После того, как пользователь отправляет изменения, он вызывает событие на стороне сервера, передающее объект-источник данных, содержащий измененные значения.

Это так просто, даже я могу понять, как его использовать.

Оцените статью
TechArks.Ru
Добавить комментарий