создать счет из заказа XAF

Я пытаюсь создать счет из заказа в XAF. Я следую Добавить действие, которое отображает всплывающее окно, с веб-сайта devexpress

Используя контроллер View и Action, у меня есть класс заказа и класс order_Details как коллекция заказов с классом Invoice и классом Invoice_Data как коллекция Invoice

  Private Sub Create_Invoice_Action_CustomizePopupWindowParams(sender As Object, e As CustomizePopupWindowParamsEventArgs) Handles Create_Invoice_Action.CustomizePopupWindowParams
        Dim objectSpace As IObjectSpace = Application.CreateObjectSpace()
        e.View = Application.CreateListView(Application.FindListViewId(GetType(elmts.OrderDetail)), _
        New CollectionSource(objectSpace, GetType(elmts.OrderDetail)), True)

    End Sub

    Private Sub ShowNotesAction_Execute(ByVal sender As Object, _
ByVal e As PopupWindowShowActionExecuteEventArgs) Handles Create_Invoice_Action.Execute


        Dim _invoiceDetails As elmts.InvoiceData = CType(View.CurrentObject, elmts.InvoiceData)
        View.ObjectSpace.SetModified(_invoiceDetails)
        For Each _nv_Det As elmts.OrderDetail In e.PopupWindow.View.SelectedObjects
            If (Not String.IsNullOrEmpty(_invoiceDetails.ProductName)) Then
                _invoiceDetails.ProductName += Environment.NewLine
            End If
            _invoiceDetails.ProductName += _nv_Det.Division
        Next _nv_Det
        Dim item As ViewItem = (CType(View, DetailView)).FindItem("ProductName")
        CType(item, PropertyEditor).ReadValue()
        'Save changes to the database if the current Detail View is displayed in the View mode 
        If TypeOf View Is DetailView AndAlso (CType(View, DetailView)).ViewEditMode = _
            ViewEditMode.View Then
            View.ObjectSpace.CommitChanges()
        End If
    End Sub
    Private Sub PopupNotesController_Activated(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Activated
        Create_Invoice_Action.Active.SetItemValue("ObjectType", DirectCast(View, DetailView).ObjectTypeInfo.Type Is GetType(elmts.Order))
    End Sub​

Другие слова, которые мне нравятся, чтобы из представления DetailView заказа с представлением OrderDetailsCollection добавить действие, которое будет

  1. Создайте новый счет-фактуру и зафиксируйте изменения в базе данных.
  2. захватите элементы текущего представления коллекции Oder.OrderDetail и передайте их во вновь созданную коллекцию Invoice.InvoiceData.
  3. Установить заказ как выставленный счет

Спасибо за любую оказанную помощь.


person Luk    schedule 15.06.2015    source источник
comment
Где ты застрял? Кнопка действия показывалась? Ошибка клика по действию? Вообще ничего не происходит? :)   -  person ErikWitkowski    schedule 16.06.2015
comment
Спасибо, ЭрикВитковски, да, это показало, и всплывающее окно показывает мне список, при нажатии кнопки «ОК» я получаю следующую ошибку. В elmts.Module.dll произошло первое случайное исключение типа «System.InvalidCastException». Дополнительная информация: невозможно преобразовать объект типа elmts.Module.elmts.Order для ввода elmts.Module.elmts.InvoiceData.   -  person Luk    schedule 16.06.2015
comment
могу я показать вам еще один кусок кода со ссылкой на него? Сначала я спрашиваю, потому что не хочу никого смущать, но это может помочь в том, чего я хочу достичь. Еще раз спасибо за вашу помощь.   -  person Luk    schedule 16.06.2015
comment
Разве это не потому, что View.CurrentObject имеет тип «elmts.Module.elmts.Order», когда вы ожидаете «elmts.Module.elmts.InvoiceData»? Пожалуйста, установите контроллер TargetObjectType = typeof(elmts.Module.elmts.InvoiceData), чтобы убедиться.   -  person ErikWitkowski    schedule 16.06.2015
comment
Я уже пробовал это, но тогда действие не будет видно из orderDetailView, и именно там оно должно быть выполнено, я публикую ссылку, о которой говорил раньше Ссылка   -  person Luk    schedule 16.06.2015
comment
Хорошо, вместо изменения TargetObjectType просто имейте в виду, что в ShowNotesAction_Execute вы получите Order как View.CurrentObject.   -  person ErikWitkowski    schedule 16.06.2015
comment
Dim _order As elmts.Order = CType(View.CurrentObject, elmts.Order); Dim _invoiceDetails As elmts.InvoiceData = _order.Invoice; ‹‹ Не уверен насчет пути к свойству.   -  person ErikWitkowski    schedule 16.06.2015
comment
Я вижу это здесь, на странице. Пожалуйста, избегайте расширенных обсуждений в комментариях. Хотите автоматически переместить это обсуждение в чат? Я не могу этого сделать, потому что у меня есть только 3 балла в соответствии с сообщением, которое я получил, когда я перешел по ссылке   -  person Luk    schedule 16.06.2015
comment
Еще раз привет, Эрик, и спасибо за всю вашу помощь, вы знаете, я никогда не задавал много вопросов на форумах, потому что я всегда жесткий, никого это не волнует, но вы доказали, что я ошибаюсь, хорошо, так что вы случайно не посмотрели на ссылка 4 пост назад?   -  person Luk    schedule 16.06.2015
comment
Я не вникал в детали вашего обращения в службу поддержки, но ошибка, с которой вы столкнулись прямо сейчас, кажется очень простой для решения. Поскольку у stackoverflow нет хорошего способа отправлять личные сообщения, я добавил ответ, чтобы мы могли продолжить.   -  person ErikWitkowski    schedule 16.06.2015


Ответы (1)


Надеюсь, это поможет:

Private Sub Create_Invoice_Action_CustomizePopupWindowParams(sender As Object, e As CustomizePopupWindowParamsEventArgs) Handles Create_Invoice_Action.CustomizePopupWindowParams
    Dim objectSpace As IObjectSpace = Application.CreateObjectSpace()
    e.View = Application.CreateListView(Application.FindListViewId(GetType(elmts.OrderDetail)), _
    New CollectionSource(objectSpace, GetType(elmts.OrderDetail)), True)

End Sub

Private Sub ShowNotesAction_Execute(ByVal sender As Object, _ByVal e As PopupWindowShowActionExecuteEventArgs) Handles Create_Invoice_Action.Execute
    'Dim _invoiceDetails As elmts.InvoiceData = CType(View.CurrentObject, elmts.InvoiceData) << Wrong, since View.CurrentObject is elmts.Order
    Dim _order As elmts.Order = CType(View.CurrentObject, elmts.Order); 
    Dim _invoiceDetails As elmts.InvoiceData = _order.CreateInvoice(); 'creates a new InvoiceData

    View.ObjectSpace.SetModified(_invoiceDetails)
    For Each _nv_Det As elmts.OrderDetail In e.PopupWindow.View.SelectedObjects
        If (Not String.IsNullOrEmpty(_invoiceDetails.ProductName)) Then
            _invoiceDetails.ProductName += Environment.NewLine
        End If
        _invoiceDetails.ProductName += _nv_Det.Division
    Next _nv_Det
    Dim item As ViewItem = (CType(View, DetailView)).FindItem("ProductName")
    CType(item, PropertyEditor).ReadValue()
    'Save changes to the database if the current Detail View is displayed in the View mode 
    If TypeOf View Is DetailView AndAlso (CType(View, DetailView)).ViewEditMode = _
        ViewEditMode.View Then
        View.ObjectSpace.CommitChanges()
    End If
End Sub
Private Sub PopupNotesController_Activated(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Activated
    Create_Invoice_Action.Active.SetItemValue("ObjectType", DirectCast(View, DetailView).ObjectTypeInfo.Type Is GetType(elmts.Order))
End Sub​
person ErikWitkowski    schedule 16.06.2015
comment
позвольте мне проверить это, и я дам вам знать - person Luk; 16.06.2015
comment
Еще раз спасибо и извините, что я так долго не отвечал, но как мне получить ссылку на счет-фактуру, если он еще не создан? - person Luk; 20.06.2015
comment
Затем вместо _order.Invoice напишите метод _order.CreateInvoice(), который вернет новый InvoiceData. Я обновил ответ выше. Если ваше действие называется Create_Invoice_Action, у вас должна быть где-то новая команда InvoiceData, вы согласны? :) Вы понимаете, что View.CurrentObject - это Order, и поэтому код, который вы разместили, неверен? Понимание этих концепций важно, прежде чем двигаться вперед. - person ErikWitkowski; 20.06.2015