Frank
Frank

Reputation: 67

Convert C# to VB.NET: Event with a delegate type that has a return type

I'm trying to have Handle multiple client callbacks in ASP.NET, and i'm following this article

I've converted C# code to my environment VB.NET/ASP.NET.

Namespace used is SmartSoft.Web.UI.WebControls

In Class called ClientCallback i've this piece of code

Public Delegate Function OnRaiseCallbackEvent(ByVal eventArgument As String) As String

Public Event Raise As OnRaiseCallbackEvent

The compiler marks the event declaration with this error message:

Events cannot be declared with a delegate type that has a return type.

I tried to follow solution here but if declare

Public Raise As OnRaiseCallbackEvent

I receive another error in another class called SampleCompositeControl

where I've

Private button1 As Button
Private button1Callback As ClientCallback

Protected Overrides Sub OnPreRender(ByVal e As System.EventArgs)
   ......
End Sub

Protected Overrides Sub CreateChildControls()
    button1 = New Button With {.ID = "Button1",.Text = "Button 1",
            .OnClientClick = "button1Clicked('', '', callbackComplete);return false;"}

        Controls.Add(button1)
        button1Callback = New ClientCallback With {
            .ID = "button1Callback"}

        button1Callback.Raise += AddressOf button1Callback_Raise
        ..........
    End Sub

    Protected Overrides Sub RenderContents(ByVal writer As HtmlTextWriter)
       ........
    End Sub

    Private Function button1Callback_Raise(ByVal eventArgument As String) As String
        Return "Button 1 callback processed."
    End Function

    Private Shared Function GetResource(ByVal resourceName As String) As String
       ..........
    End Function

    Private Function GetCallbackReference(ByVal control As Control) As String
        Return Page.ClientScript.GetCallbackEventReference(control, "arg", "callback", "context")
    End Function

The compiler marks button1Callback.Raise += AddressOf button1Callback_Raise

with this error message:

'+' operator is not defined for types 'SmartSoft.Web.UI.WebControls.SmartSoft.Web.UI.WebControls.ClientCallback.OnRaiseCallbackEvent' and 'Void'.

How can I properly translate the code from C# to VB.NET without losing functionality?

Upvotes: 1

Views: 684

Answers (2)

Frank
Frank

Reputation: 67

Solved in this way:

following djv's suggestion (have events return a value like in C# is not possible in VB.NET)

i've build a WebControl in C#, added control to probject and put in ASPX Page this tag

<%@ Register Assembly="SmartOBJ.Web.UI.WebControls" Namespace="SmartOBJ.Web.UI.WebControls" TagPrefix="SmartOBJ" %>

<SmartOBJ:SampleControl ID="SampleControl1" runat="server" />

This the call on click in ASPX

..... other javascript code
switch (Type) {
    case 'E':
        delRECORD(ID_RECORDD.toString()+';E', '', callbackComplete); return false;break;
    case 'SC':
        delRECORD(ID_RECORDD.toString() + ';SC', '', callbackComplete); return false;break;
    case 'SS':
        mess = 'xxxx';break;}
........

This c# file:

using System.IO;
using System.Reflection;
using System.Web.UI;

using System.Web.UI.WebControls;
using System.Text.RegularExpressions;

[assembly: TagPrefix("SmartOBJ.Web.UI.WebControls", "SmartOBJ")]
namespace SmartOBJ.Web.UI.WebControls
{
    [ToolboxData("<{0}:SampleControl runat=server></{0}:SampleControl>")]
    public class SampleControl : CompositeControl
    {
        #region members
        private Button button1;
        private ClientCallback delRECORD;
        #endregion

        protected override void OnPreRender(System.EventArgs e)
        {
            base.OnPreRender(e);

            // Register client side script for the callbacks
            string clientScript = GetResource("SmartOBJ.Web.UI.WebControls.Resources.SampleControlClientScript.js");
            clientScript = clientScript.Replace("{button1_callback_reference}", GetCallbackReference(button1Callback));
            clientScript = clientScript.Replace("{delRECORD_callback_reference}", GetCallbackReference(delRECORD));
            Page.ClientScript.RegisterClientScriptBlock(GetType(), "client_script", clientScript, true);
        }

        protected override void CreateChildControls()
        {
            // Create buttons
            button1 = new Button
                          {
                              ID = "Button1",
                              Text = "Button 1",
                              Visible = false,
                              OnClientClick = "button1Clicked(ID_RECORD, '', callbackComplete);return false;"

                          };
            Controls.Add(button1);


            // Create callback controls
            delRECORD = new ClientCallback { ID = "delRECORD" };
            delRECORD.Raise += delRECORD_Raise;
            Controls.Add(delRECORD);


        }

        protected override void RenderContents(HtmlTextWriter writer)
        {
            // Render buttons
            button1.RenderControl(writer);

            // Render result div
            writer.AddAttribute(HtmlTextWriterAttribute.Id, "result");
            writer.RenderBeginTag(HtmlTextWriterTag.Div);
            writer.RenderEndTag();

            // Render callback controls
            delRECORD.RenderControl(writer);
        }

        /// Handles client callback events for delRECORD.
        /// <param name="eventArgument">
        private string delRECORD_Raise(string eventArgument)
        {
            ToolsDB mytool=new ToolsDB();
            bool verify=false;
            string msg="";
            string msg2 = "";

            string[] parameters = Regex.Split(eventArgument, ";"); 

            if  (parameters[1] == "E")
                {
                    msg = "msg1";
                    msg2= " msg2"; 
                    verify=mytool.delRECORD(parameters[0],parameters[1]); // This part execute other code to manage DB and is defined in another class
                }

            if (parameters[1] == "SC")
            {
                msg = " msg1";
                msg2 = " msg2";
                verify = mytool.delRECORD(parameters[0], parameters[1]);
            }


            if (verify == true) 
                {return "ALLISOK;" + parameters[0] +";Record with ID " + parameters[0] + msg;}
            else
                { return "NOTOK;" + parameters[0] + ";Record with ID " + parameters[0] + msg2; }        
        }

        private string button1Callback_Raise(string eventArgument)
        {
            return eventArgument.ToString() + "_" + "Button 1 callback processed." ;
        }


        /// Helper to load embedded resource as a string.
        private static string GetResource(string resourceName)
        {
            Assembly assembly = Assembly.GetExecutingAssembly();
            string result = string.Empty;
            Stream resourceStream = assembly.GetManifestResourceStream(resourceName);
            if (resourceStream != null)
            {
                using (TextReader textReader = new StreamReader(resourceStream))
                {
                    result = textReader.ReadToEnd();
                }
            }
            return result;
        }

        private string GetCallbackReference(Control control)
        {
            return Page.ClientScript.GetCallbackEventReference(control, "arg", "callback", "context");
        }
    }
}

This resource file in js contains

function button1Clicked(arg, context, callback) {
    {button1_callback_reference};
}


function delRECORD(arg, context, callback) {
    {delRECORD_callback_reference};
}

function callbackComplete(result, context) {
    var parameters = result.split(";");
    if (parameters[0] == 'ALLISOK')
        {
        $table.bootstrapTable('remove', {
            field: 'id',
            values: [IDRow]
        });
        alert(parameters[2]);
        $('#deletemovedir').modal('toggle');
    }
    else
        {
        alert(parameters[2]);
        }
}

Upvotes: 0

Jonathon Chase
Jonathon Chase

Reputation: 9704

VB.NET uses AddHandler for event registration, whereas C# uses the += syntax.

Try AddHandler button1Callback.Raise, AddressOf button1Callback_Raise

Upvotes: 3

Related Questions