【问题标题】:Convert C# to VB.NET: Event with a delegate type that has a return type将 C# 转换为 VB.NET:具有返回类型的委托类型的事件
【发布时间】:2019-07-10 16:09:48
【问题描述】:

我正在尝试在 ASP.NET 中处理多个客户端回调,我正在关注这个article

我已将 C# 代码转换为我的环境 VB.NET/ASP.NET。

使用的命名空间是 SmartSoft.Web.UI.WebControls

在名为 ClientCallback 的类中,我有这段代码

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

Public Event Raise As OnRaiseCallbackEvent

编译器用以下错误消息标记事件声明:

不能使用具有返回类型的委托类型来声明事件。

我尝试遵循解决方案here 但如果声明

Public Raise As OnRaiseCallbackEvent

我在另一个名为 SampleCompositeControl

的类中收到另一个错误

我在哪里

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

编译器标记 button1Callback.Raise += AddressOf button1Callback_Raise

带有此错误消息:

'+' 运算符没有为类型“SmartSoft.Web.UI.WebControls.SmartSoft.Web.UI.WebControls.ClientCallback.OnRaiseCallbackEvent”和“Void”定义。

如何在不丢失功能的情况下正确地将代码从 C# 转换为 VB.NET?

【问题讨论】:

  • 您是否尝试过一些在线代码转换器,例如http://converter.telerik.com/,以查看生成的输出是否与您的 VB.Net 代码不同
  • 是的当然是我做的第一步。
  • 将代理声明为Sub,而不是Function。因为,如果事件被触发,函数结果应该分配到哪里?
  • 如果我使用 SUB 而不是 FUNCTION 编译器告诉 thar RAISE 是一个事件,我无法声明,我必须在以下指令中使用 RaiseEvent。 Public Sub RaiseCallbackEvent(ByVal eventArgument As String) If Raise IsNot Nothing Then callbackResult = Raise(eventArgument) End Sub。我的目标是有多个客户端回调。在这种情况下,我尝试使用两个简单的按钮。
  • 看看this question,其中 OP 询问 VB.NET 是否有返回值的事件,this answer 声明“这在 VB.NET 中是不可能的”

标签: c# asp.net vb.net


【解决方案1】:

VB.NET 使用AddHandler 进行事件注册,而C# 使用+= 语法。

试试AddHandler button1Callback.Raise, AddressOf button1Callback_Raise

【讨论】:

  • 如果我使用 AddHandler button1Callback.Raise, AddressOf button1Callback_Raise Compiler “说我” Raise 不是事件,因为 Public Delegate Function OnRaiseCallbackEvent(ByVal eventArgument As String) As String Public Raise As OnRaiseCallbackEvent 并且如果声明为 Event接收“不能使用具有返回类型的委托类型声明事件”
【解决方案2】:

这样解决:

遵循 djv 的建议(在 VB.NET 中不可能让事件返回像 C# 中的值)

我在 C# 中构建了一个 WebControl,向 probject 添加了控件 并将此标签放入 ASPX Page

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

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

这是 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;}
........

这个 c# 文件:

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");
        }
    }
}

js中这个资源文件包含

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]);
        }
}

【讨论】:

    猜你喜欢
    • 2017-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多