【问题标题】:Calling methods with parameters inside other methods在其他方法中调用带有参数的方法
【发布时间】:2017-12-29 09:47:52
【问题描述】:

我有这两种方法,乍一看都很好。

但问题是RadWizard2_NextButtonClick方法的e参数返回的是radTxb_TextChanged方法的e参数的值。

我尝试在其中一种方法中更改e 参数的名称,但实际上它不应该一直返回null

知道为什么会发生这种情况或我做错了什么吗?

protected void radTxb_TextChanged(object sender, EventArgs e)
{ 
    //dothings
    if (!opMsg.IsError)
    {
        RadWizard2_NextButtonClick(sender, e as WizardEventArgs); // arguments WITHOUT types    
    }
}

【问题讨论】:

  • 实际的错误信息是什么?
  • void 如何返回任何内容?你能澄清你的问题吗?
  • @Saruman 这是我得到“对象引用未设置为对象的实例”的异常,它来自返回 null 的 e 参数,因为没有从 WizardEventArgs 获取值
  • @oerkelens 未从 WizardEventArg 获取值,因此返回 null。为什么以及如何我不知道为什么。这就是我向您寻求帮助的原因
  • 您的意思是将EventArgs 转换为WizardEventArgs 会导致null。这已经解释过了。

标签: c# methods parameters


【解决方案1】:

您必须创建 WizardEventArgs 实例,例如:

 protected void radTxb_TextChanged(object sender, EventArgs e) { 
   if (!opMsg.IsError) {
     // It seems you have to provide some parameters:
     // currentIndex and nextIndex which
     RadWizard2_NextButtonClick(sender, 
                                new WizardEventArgs(currentIndex, nextIndex)); 
   }
 }

如果你检查e 实例,你会发现它是EventArgs 类型的;并且 sice EventArgs 没有从 WizardEventArgs 继承(恰恰相反:它是从 EventArgs 派生的 WizardEventArgs

  e as WizardEventArgs

返回nulleEventArgs instabce 不能被视为WizardEventArgs 实例)

【讨论】:

  • 你的代码给了我这个错误 'Telerik.Web.UI.WizardEventArgs' does not contain a constructor that takes 0 arguments
  • @Lara 然后看看你的编辑给你的提示。它可能会告诉你有哪些构造函数以及你应该将什么传递给它们。
  • @Lara:看来你应该提供两个参数:currentIndexnextIndex参数;这些索引的值是多少取决于您的程序逻辑
  • @DmitryBychenko 来自 WizardEventArgs 类命名空间 Telerik.Web.UI { public class WizardEventArgs : EventArgs { public WizardEventArgs(RadWizardStep currentStep, RadWizardStep nextStep);公共 RadWizardStep CurrentStep { 获取;放; } 公共 int CurrentStepIndex { 获取;放; } 公共 RadWizardStep NextStep { 获取;放; } 公共 int NextStepIndex { 获取;放; } } }
  • @Lara:请注意 constructor's 声明 public WizardEventArgs(RadWizardStep currentStep, RadWizardStep nextStep);。所以如果我们要创建WizardEventArgs 实例,我们必须提供currentStepnextStep 参数
【解决方案2】:

我知道我参加聚会迟到了,但是你可以通过null 逃脱惩罚

protected void radTxb_TextChanged(object sender, EventArgs e)
{ 
    //dothings
    if (!opMsg.IsError)
    {
        RadWizard2_NextButtonClick(sender, null); // arguments WITHOUT types    
    }
}

【讨论】:

  • 是的,我可以,但问题是我不希望 e 为空,我希望它从 WizardEventArgs 返回一些东西
  • @Lara 在这种情况下您需要与 Dmitry Bychenko 一起回答
【解决方案3】:

让我建议一种不同的方法。

您正在尝试直接调用 UI 事件处理程序。这几乎总是一个坏主意。事件处理程序旨在处理事件,而不是用作库方法。

如果您在 radTxb_TextChanged 方法中需要来自 RadWizard2_NextButtonClick 的代码,只需将其提取到新方法中即可:

之前:

protected void RadWizard2_NextButtonClick(object sender, WizardEventArgs e)
{
    ... // some code here
}

之后:

protected void RadWizard2_NextButtonClick(object sender, WizardEventArgs e)
{
    DoStuff();
}

private void DoStuff()
{
    ... // some code here
}

您现在可以在您的radTxb_TextChanged 方法中调用DoStuff

【讨论】:

  • 我想我理解你的方法,但问题是(我正在使用你的 exe)我需要首先通过 DoStuff 方法而不是检查其他方法。需要明确的是,我有一个条形码阅读器来扫描物品。我扫描通过 DoStuf 方法,如果找到该项目,则使用 RadWizard2_NextButtonClick(第二步中的方法)等
  • @Lara:这是你误会了:RadWizard2_NextButtonClick 是NOT进入第二步的方法。 RadWizard2_NextButtonClick 是一个事件处理程序,允许您添加在进入第二步时执行的自定义代码。
  • @Lara:要进行下一步,您需要执行以下操作:RadWizard2.SelectedPageIndex = ...;(查看 RadWizard 文档了解详细信息,我自己从未使用过)。
  • 但是如果我首先进入 RadWizard2_NextButtonClick 方法,除了检查应该在 DoStuff 中完成的条形码之外,还有什么可能呢?
【解决方案4】:

当您需要做某事时,请编写一个完全符合您需要的方法。给它一个描述它做什么的名字,并且只给它它需要的参数。然后,您可以从事件处理程序或其他任何地方调用该方法。您还可以将该方法放在一个单独的类中,这样您就可以在需要时跨页面重用它,并防止代码隐藏变得太大。

奇怪的是,内置事件处理程序通常包含模糊的参数,这些参数甚至没有被使用,也没有被转换为正确的类型,例如:

protected void radTxb_TextChanged(object sender, EventArgs e)

显然,发送者不会是任何对象。这将是一种特定类型的控制。并且事件 args 也将属于特定类型。它们的投射方式意味着它们无关紧要,而且在许多情况下它们甚至不会被使用。仅仅因为方法被触发,我们就知道发生了什么,我们对此做出响应并忽略参数。

但我们不需要遵循该约定。我们可以根据自己的要求编写我们的方法。如果您想在事件触发后使用RadWizard 做某事,您可以编写您想要的方法:

public void DoSomethingWithTheRadWizard(RadWizard radWizard)

在事件处理程序中,从参数中提取您需要的任何值,然后调用您更具体的方法。当所有参数都被使用并且每个参数都被声明为正确的类型时,阅读和理解会容易得多。

【讨论】:

    猜你喜欢
    • 2015-10-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 2017-06-25
    • 2015-02-11
    • 2015-01-22
    • 2021-10-14
    相关资源
    最近更新 更多