I had a situation where I had a Payment UserControl that had say, 20 properties on it. I also had a Class file (App_Code) that I wanted to use to handle some of the business logic when the payment was complete. Say create tables in the database.
I could have A) Created a method on the class and sent in 20 arguments. B) Created 20 properties on that class and populate them all before I call the method. But that was waste of code to me, when I already had the information. I just wanted to do something with it.
So I thought, what if I just send in my UserControl into my class method by reference, then I can just use the properties directly to retrieve the value. So I tried… no luck. Class can’t see my UserControl class.
Problem/Broken Version:
My UserControl’s class is Application_Controls_Payment
Partial Class Application_Controls_Payment Inherits System.Web.UI.UserControl '...End Class
In my class file I tried to use it as an argument on a function that the page would send me. However this fails on the compiler.
Public Shared Function CreateTransactionRecordInDB(ByRef PaymentUserControl As Application_Controls_Payment) As Integer 'This Errors, as Application_Controls_Payment class from the UserControl can not be seen from this levelEnd Function
Solution:
So I created an Interface for all the properties, and Implemented it on my UserControl. Then Sent the UserControl as the Interface and low and behold, it works great!
Step 1: Create Interface with all the properties.
Public Interface PaymentControl Property CreditCardNumber() As String Property CCVCode() As String Property ExpirationMonth() As String Property ExpirationYear() As String Property TransactionAmount() As Double Property TransactionAmountAdditionalInfo() As String Property TransactionDescription() As String Property InvoiceNumber() As String Property BillingFirstName() As String Property BillingLastName() As String Property BillingEmail() As String Property BillingCompany() As String Property BillingAddress() As String Property BillingState() As String Property BillingCity() As String Property BillingZipCode() As String Property CustomerID() As String Property CustomerIPAddress() As String Property EmailCustomerReceipt() As Boolean Property EmailReceiptHeader() As String Property EmailReceiptFooter() As String Property EmailOfMerchant() As String Property TestMode() As Boolean Property ValidationGroup() As StringEnd Interface
Step 2: Implement this Interface To your UserControl
Partial Class Application_Controls_Payment Inherits System.Web.UI.UserControl Implements CheckOut.PaymentControl Public Property CreditCardNumber() As String Implements CheckOut.PaymentControl.CreditCardNumber Get Return txtCCNumber.Text End Get Set(ByVal Value As String) txtCCNumber.Text = Value End Set End Property Public Property CCVCode() As String Implements CheckOut.PaymentControl.CCVCode Get Return txtCCVCode.Text End Get Set(ByVal Value As String) txtCCVCode.Text = Value End Set End Property'... Rest of ProperitesEnd Class
Step 3: Change your Method Constructor to want the Interface class vs trying to call the UserControl’s class.
Public Shared Function CreateTransactionRecordInDB(ByRef PaymentUserControl As PaymentControl) As Integer 'Now you can reference the properties from the usercontrol Dim oPaymentTransactions As New PaymentTransaction oPaymentTransactions.BillingAddress = PaymentUserControl.BillingAddress oPaymentTransactions.CCVCode = PaymentUserControl.CCVCode oPaymentTransactions.CCExpirationMonth = PaymentUserControl.ExpirationMonth 'Rest of code hereEnd Function
And there you go.