Want to Pass In a UserControl into your Class? Yes it’s possible.

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


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.

Tip Of the Day - Remove Duplicate Items from a List(Of T) (or a List of whatever the hell you want)

Look up Enum Value by String