Reputation: 67
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
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
Reputation: 9704
VB.NET uses AddHandler for event registration, whereas C# uses the +=
syntax.
Try AddHandler button1Callback.Raise, AddressOf button1Callback_Raise
Upvotes: 3