【问题标题】:Accessing other buttons from one button's "click" method从一个按钮的“单击”方法访问其他按钮
【发布时间】:2019-09-09 23:00:15
【问题描述】:

如何通过一个按钮的点击方法访问其他按钮?我在 Milestone SDK(c#,visual studio)中工作。

我尝试过使用“this.”,但它显然不起作用...(我是 c# 的新手)...

在下面的示例中,我可以更改 bbt 按钮对象的 "CONTENT" (bbt.Content = "TEST";):

private void bbt_Click(object sender, RoutedEventArgs e)
{
var bbt = sender as Button;

bbt.Content = "TEST";
}

但是如何更改在我的代码中定义的其他按钮的内容?例如,另一个按钮名称是“action1”?

也许有一种方法可以声明类似的东西:

var bbt = sender as Button;

但是对于所有其他按钮,我可以像访问“bbt”一样访问它们?

想要一个允许 mi 做的代码:

action1.Content = "TEST";

其中 action1 是另一个按钮。

看起来我需要在引用“action1”之前添加一些前缀,否则它不可见并生成:

CS0103 当前上下文中不存在名称“action1”

【问题讨论】:

  • 是的,您可以为多个控件创建单个事件处理程序并将object sender 转换为适当的控件类型。至于您访问action1 的问题,没有足够的信息可以了解。首先,这是 WinForms 吗? WPF?还有什么?
  • 典型的例子是用数字键盘编写一个计算器。在这种情况下,所有按钮都将有一个数字 0..9 作为它们的 Text 属性。在这种情况下,您可以对所有数字按钮使用相同的处理程序,代码类似于 if (sender is Button btn) { /* code to extract digit from Text property and do the calculator work */ }
  • action1和bbt是同一种形式吗?
  • 是的,它们在同一张表格上。基本上我使用 Milestone SDK(相机 VMS)。用常规 c# 做了模型,效果很好,问题是我需要坚持使用 Milestone SDK ActiveOverlay
  • 这里是整个代码的链接 - 也许你们可以帮助我:shrib.com/#IcinRLal40GYR48ZEpCf

标签: c#


【解决方案1】:

看起来您正在尝试更改按钮标签。 如果按钮已经存在,请使用:

private void bbt_Click(object sender, RoutedEventArgs e) { bbt.Text= "TEST"; }

【讨论】:

  • 是的,但问题是我需要更改另一个按钮的标签,称为“action1”,其定义方式与bbt相同。所以完美的解决方案是:action1.Content="test";但这会生成:CS0103 The name 'action1' does not exist in the current context
【解决方案2】:

如果您有一个像flowLayoutPanel,panels 这样的容器,其中子元素是按钮,您可以使用forloop 获取所有buttons 并更改它contents

//if without a container you must Name your buttons to button1,button2,button3
int i=0;
while(true){
  i++;
 Button button = new Button();
 button.Name = "button"+i.toString();//output button1 to n
 WindowsFormName.Controls.Add(button);
}


private void bbt_Click(object sender, RoutedEventArgs e)
{

  //loop all controls
  int y=0;
  foreach(Control control in WindowsFormName.Controls){

  y++;

  string name = "Button"+y.toString();

    //check if names are button1 or buttonN
  if(control.Name.Equals(name){
        control.Content = "TEST";
    }
   }

}

【讨论】:

  • 谢谢,但是没有 flowlayoutpanel 有没有办法做到这一点?
  • 请检查整个代码 - 我以不同的方式定义按钮:shrib.com/#IcinRLal40GYR48ZEpCf
【解决方案3】:

如果按钮与被单击的按钮处于同一层次结构中,您应该能够正常访问它(例如 action1.Text = "hello world";)。我相信您的问题可能是该按钮位于子控件上。

如果是这种情况,您必须编写某种类型的递归代码才能找到所需的按钮(请参阅这篇文章的答案以递归搜索控件Get control by name, including children

然后调用它:

var actionButton = this.FindControlRecursively<Button> ("action1");

【讨论】:

  • 我认为这是我通常需要的,但不幸的是它会产生一个错误:CS1061 'ActiveElementsOverlayBackgroundPlugin' 不包含'FindControlRecursively' 的定义并且没有可访问的扩展方法'FindControlRecursively' 接受第一个可以找到“ActiveElementsOverlayBackgroundPlugin”类型的参数(您是否缺少 using 指令或程序集引用?)
  • 您的问题似乎是 ActiveOverlay,因为我从未使用过它我不知道如何解决这个问题。
猜你喜欢
  • 2014-10-13
  • 2012-06-02
  • 1970-01-01
  • 1970-01-01
  • 2015-03-28
  • 1970-01-01
  • 1970-01-01
  • 2022-11-02
  • 1970-01-01
相关资源
最近更新 更多