按钮事件处理程序

阿罗马修

成员
已加入
2019年8月5日
留言内容
19
编程经验
Beginner
我在一个捕获click事件的单独类中创建了一个动态按钮和一个常规事件处理程序
公共静态void buttonClick(对象发送者,EventArgs e)
但是,在此处理程序中,尽管调试器按了执行这些任务的行,但我无法执行更改按钮文本和图像之类的操作,但对按钮没​​有影响。
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,563
地点
悉尼,澳大利亚
编程经验
10+
How are we supposed to know what's wrong with your code if you don't show us your code? Generally speaking, you use the sender parameter to access the object that raised the event, so you can use the same event handler for as many objects as you like.
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,605
地点
弗吉尼亚州切萨皮克
编程经验
10+
Perhaps I am missing something... every WebControl has a Page property. Why can't you find the other control on the page?
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,563
地点
悉尼,澳大利亚
编程经验
10+
Perhaps I am missing something... every WebControl has a Page property. Why can't you find the other control on the page?
鉴于OP已在不适当的论坛上发布,我们甚至都不知道它是Web应用程序还是Windows应用程序。这不是有关Visual Studio的一般问题。
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,563
地点
悉尼,澳大利亚
编程经验
10+
是的,它适用于调用事件处理程序的按钮,但我实际上试图做的是使用get控制方法访问其他按钮。
You didn't say anything about another Button in post #1 and you still haven't provided the relevant code. We are here because we want to help but you are making all but impossible for us to do that. Instead of making us guess and/or drag every little bit of information out of you, please provide a FULL and CLEAR description of the problem, which includes EXACTLY what you're trying to achieve, EXACTLY how you're trying to achieve it (including relevant code) and EXACTLY what happens when you try (including error messages and where they occur).
 

羊皮

退休程序员
已加入
2018年9月5日
留言内容
1,982
地点
英国
编程经验
10+
嗯,我很困惑为什么你有一个 静态的 按钮。您的访问修饰符让我假设您正在使用winforms,因为最常见的按钮是说说asp.net之类的Web应用将使用公共/私有保护。因此,我认为这是一个Winforms问题。

向我们展示您的福彩12选5走势图,所有这些都与您创建新按钮的方式有关。
 
Last edited:

阿罗马修

成员
已加入
2019年8月5日
留言内容
19
编程经验
Beginner
其Windows窗体C#应用程序。调用获取控件以获取除单击的按钮以外的其他按钮。返回一个控件,修改后该控件无效。
这是我的控制方法
C#:
public static void GetAllControl(Control c, List<Control> list)
{
foreach (Control control in c.Controls)
                {
                    list.Add(control);
                    if (control.GetType() == typeof(Panel))
GetAllControl(control, list);
}
            }
            public static Control getControl(Form f, string name, Type type)
{
                List<Control> list = new List<Control>();
                GetAllControl(f, list);
                foreach (Control control in list)
{
                    if (control.GetType() == type && control.Name.Equals(name))
                        return control;
                }
                return null;
            }
 

羊皮

退休程序员
已加入
2018年9月5日
留言内容
1,982
地点
英国
编程经验
10+
请编辑您的帖子,然后使用福彩12选5走势图标签按钮。
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,563
地点
悉尼,澳大利亚
编程经验
10+
我已经对您发布的福彩12选5走势图进行了格式化,但是可读性却更高。这种看似随机的缩进是荒谬的。我觉得我们在被混混。同样,我们希望提供帮助,但您需要帮助我们做到这一点,因此,发布尽可能可读的福彩12选5走势图是其中的重要部分。这也很容易,因为IDE会为您格式化它,而您只需要复制它即可。如果您不这样做,请花一些时间手工格式化,因为您希望我们自愿提供时间来帮助您。该福彩12选5走势图应如下所示:
C#:
public static void GetAllControl(Control c, List<Control> list)
{
    foreach (Control control in c.Controls)
    {
        list.Add(control);

        if (control.GetType() == typeof(Panel))
            GetAllControl(control, list);
    }
}

public static Control getControl(Form f, string name, Type type)
{
    List<Control> list = new List<Control>();
    GetAllControl(f, list);

    foreach (Control control in list)
    {
        if (control.GetType() == type && control.Name.Equals(name))
            return control;
    }

    return null;
}
显然更容易阅读。
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,563
地点
悉尼,澳大利亚
编程经验
10+
现在我觉得自己更像朋克。您还没有发布事件处理程序福彩12选5走势图!这很可能是实际问题所在。我的猜测是您在调用时传递了错误的表格,但我不必猜测。
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,563
地点
悉尼,澳大利亚
编程经验
10+
我建议您无论如何都要摆脱所有这些福彩12选5走势图。我想不出什么是您正在做的最好的方法,但是您仍然没有真正说明您要实现的目标。当您想帮助某人但他们拒绝努力提供帮助所需的信息时,这非常令人沮丧。人们只会坚持那么久,最终只会离开您而没有想要的帮助。我建议您做出努力。

We know that you're trying to affect a Button other than the one that was clicked but we don;t know how or why. The why is important because that will often dictate the how. For instance, if you have pairs of Buttons where clicking one should affect the other then it would make sense to assign one Button to the Tag property of the other, so you can then access it directly via the sender parameter in the event handler.

如果按名称获取特定类型的控件是最好的方法,请以包含该控件的形式进行操作,如下所示:
C#:
var btn = this.Controls.OfType<Button>().FirstOrDefault(b => b.Name == name);

if (btn != null)
{
    // Use btn here.
}
 

羊皮

退休程序员
已加入
2018年9月5日
留言内容
1,982
地点
英国
编程经验
10+
老实说,我希望您在写本书之前先读一本有关C#的书或进行一些研究。
  • 传递给什么 getControl ?
  • 应该传递什么 f,名称和类型 ?
  • 这与按钮有什么关系?
  • 关于按钮处理程序的所有说明是什么?
  • 您想达到什么目的(不是用福彩12选5走势图实现),但是总的来说呢?
  • 最后,为什么您的对象是静态的?
当然,如果您要传递表格之类的东西,那么最好使用实例?

如果您可以回答某些问题,也许我们可以帮助您构建所需的内容。就目前而言,您写的东西对很多有用的东西没有多大意义。
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,605
地点
弗吉尼亚州切萨皮克
编程经验
10+
几乎感觉像是OP正在尝试为WPF的早期概念之一创建穷人版本,最终用户或设计者在其中创建UI或外观,而开发人员提供了驱动UI的逻辑。最初设想WPF的时候,人们认为UI设计师会使用Blend参与UI,而开发人员会在ViewModel和Models中编写所有福彩12选5走势图。

当然,这就是所有猜测,因为我们的OP似乎对他正在尝试的操作不太满意。
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,563
地点
悉尼,澳大利亚
编程经验
10+
老实说,我希望您在写本书之前先读一本有关C#的书或进行一些研究。
  • 传递给什么 getControl ?
  • 应该传递什么 f,名称和类型 ?
  • 这与按钮有什么关系?
  • 关于按钮处理程序的所有说明是什么?
  • 您想达到什么目的(不是用福彩12选5走势图实现),但是总的来说呢?
  • 最后,为什么您的对象是静态的?
当然,如果您要传递表格之类的东西,那么最好使用实例?

如果您可以回答某些问题,也许我们可以帮助您构建所需的内容。就目前而言,您写的东西对很多有用的东西没有多大意义。
我已经看到很多VB初学者,甚至中级开发人员都认为他们通过创建一个模块,然后在其中放置与表单相关的功能,从而可以从多种表单中访问它,来做正确的事情。 VB模块的C#等效项是静态类,因此我猜想OP将功能放在可以从任何形式访问的静态类中。如果要编写所有这些福彩12选5走势图以按名称访问特定类型的子控件,那么您就不想以多种形式多次编写它,因此从该角度出发,这样做的动机很好。问题是,正如我所展示的,您不需要那么多福彩12选5走势图。如果您编写简洁的福彩12选5走势图来执行此操作,则将其放在公共位置不会有任何好处。如果确实需要编写足够的福彩12选5走势图来建立一个公用位置,我仍然建议不要使用静态类,因为您可以将实例成员放在基类中,然后从中派生所有形式。

因此,我想我可以猜出您的一些问题的答案,尽管正如我已经说过的那样,我们确实不必猜测这些东西。我认为OP创建了一个静态类,该类具有可以从任何形式调用的方法以在该形式或其任何子控件中找到控件。我毫不怀疑,如果应用程序最初设计得更好,那么这些方法可能会写得更好,甚至根本不需要。同样,如果没有关于此处实际目标的更多信息,我们将无法知道什么是好的设计。这是一个案例,有人问我们如何实现目的的手段而没有解释目的,因此我们实际上无法解释有什么更好的手段。
 

羊皮

退休程序员
已加入
2018年9月5日
留言内容
1,982
地点
英国
编程经验
10+
So, I think I can guess the answers to some of your questions, although, as I've said, we really shouldn't have to guess this stuff.

同意,但是直到我们得到我所问问题的答案,我们才会知道。 OP需要挺身而出并详细解释,以便我们能够为他们的问题提供最佳答案。我的怀疑很明确,我觉得我的问题将揭露OP试图做的事情的丑陋一面。

OP:关于静态对象和实例化对象,以及正确的处理方式;在某些特定情况下,我会使用静态变量,因为它们也会使您感到恐惧 福彩12选5走势图气味 有时可能比他们值得的麻烦得多,通常是在进行故障排除时。是的,确保它们偶尔会用到,但是我尝试避免使用静态变量的另一个原因是,因为它们不利于测试,尤其是单元测试,并且无法与接口一起使用。静态方法无法很好地与实例化对象配合使用,并且无法对此进行全面的辩论。就像我之前在某处说过的:有几种方法可以在类上使用委托以从静态类派生某些功能,也可以在接口中使用委托。但是,如果您想为程序构建一个好的模型,那么所有这一切都是不切实际的,您真的应该考虑以正确的方式进行处理,并在需要实例化的地方进行实例化,而不是使用静态方法来掩盖更快,更轻松地访问;可以这么说。我的猜测是,由于您不知道如何使用实例化的对象,因此您极有可能尝试这样做。

我将发布此伪福彩12选5走势图,以为我们的OP演示使用静态和实例化方法,类和属性的不同用法。也许这也将帮助将来的读者了解使用实例和静态变量的知识,并使它更容易理解您可以做什么和不能做什么...
用于测试和实验的伪指令:
    public static class Test : InterFaceA //Inheritance can't be done, as static classes can't inherit interfaces
    {
        public object foo; //has no status here because instance members do not belong in static member classes
        public static object doo; //Has status here because static objects can reside in static classes
        public void MethodA() //Has no status here because it is not a static method
        {
            //This is a non functional method because its not declared static, nor should an instantiable member be in a static class
        }
        public static void MethodB() //Has status here because static methods can reside in a static class
        {
            NewTest nTest = new NewTest();
            nTest.MethodA(); //Here we instantiate a new instance of the non static class NewTest and call Method A
            nTest.MethodB(); //Method B however can not be called by an instance reference, and must be called by its static type.
            NewTest.MethodB(); //This is a non instantiated call directly to the static method
        }
    }
    public class NewTest : InterFaceA //Inheritance can be done, as non-static classes can inherit interfaces
    {
        public object foo; //has status here because instance members belong in non-static member classes
        public static object doo; //Has status here because static objects can reside in non-static classes
        public void MethodA() //Has status here because it is a non-static method in a instantiable class
        {
            Test.MethodB(); //You can call Method B, but not Method A because Method A does not have any business being an instantiable member in a static class
        }
        public static void MethodB() //Has status here because static methods can reside in a instantiable class
        {
            Test newTest = new Test(); //This won't work because you can not create an instance of a static class, nor can you declare a variable of a static type
        }
    }
    public interface InterFaceA
    {

    }
现在你有这个小"cheat sheet", you can go about 找到你的控制 如其文档中所述 还是这里 (由James Curran编写),并按其应有的方式从其他类中调用它们。我同意放弃上述福彩12选5走势图并重新开始。正如我所见,没有可能没有理由去做您想做的事情,当然,没有没有更多明确的信息。
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,605
地点
弗吉尼亚州切萨皮克
编程经验
10+
等到有人像您现在创建的那样编写一些体系结构不佳的意大利面条福彩12选5走势图,然后将其留给您维护。让我们看看您当时会说哪种语言。

许多志愿者本质上是希望培训来这里的人们编写好的福彩12选5走势图,因为我们最终可能会与他们一起工作,继承或维护他们的福彩12选5走势图。我们尝试消除不良习惯,并引导人们学习最佳实践。

艺术中有格言:要打破规则,您需要充分了解规则。也许您正在尝试创建一些突破性的东西,但是从我们经验丰富的眼光来看,您现在还没有足够了解规则,因此无法以一种新颖而有见地的方式打破它们。
 

羊皮

退休程序员
已加入
2018年9月5日
留言内容
1,982
地点
英国
编程经验
10+
我希望工作人员消除了一行侮辱您的禁令。

如果您是那种对那些提供时间和经验以完全免费的方式帮助您的人的态度,那么您别无其他。由于您不知道根据所提供的福彩12选5走势图在做什么,因此我决定向您解释如何使用静态成员和实例成员并演示其用法。如果您采纳了写下来的建议并遵循了链接,那么您将继续处于困境。你写的东西绝对适合这个垃圾箱。

我拒绝帮助像你这样的人。收到的答复真是可怕。
 

阿罗马修

成员
已加入
2019年8月5日
留言内容
19
编程经验
Beginner
从按钮事件中调用click事件也不会执行任何操作。一个人应该可以从他的照片中了解我要做什么。选择人才后,需要将其照片和标签添加到构建中。这个问题使我无法完成这个项目。

截图(60).png
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,605
地点
弗吉尼亚州切萨皮克
编程经验
10+
如果您遵循正确的MVC或MVP(甚至MVVM)体系结构,则单击图片将导致您的构建模型被更新并添加了选定的人才,并且视图将被更新并带有图片和标签。模型中的当前人才。

las,您正在同时使用UI和View和Model。早在80年代和90年代,这就是建造方式"programs"在Windows上由于内存消耗和CPU速度的原因。但这是20年前。从那时起,内存,处理器和编程技术得到了发展。现在不建议将UI用作数据模型。 UI唯一要做的是反映数据的当前状态。

暂且不说,将按钮单击事件处理程序放在一个单独的静态类中会带来什么好处仍然不清楚。如果目标是福彩12选5走势图重用,那么您应该使用聚合而不是委托。或者,您也可以选择使用继承,但是当我为WinForm表单使用继承时,我过去的所有经验都是负面的。对于WinForms中的福彩12选5走势图重用而言,继承的第二好方法是使用UserControls-本质上是一种视觉聚合形式。
 
Last edited:
最佳 底部