0

首先,我是新来的,并且是 csharp 的新手。只是在做一些学习csharp的练习时筋疲力尽。找不到解决方案为什么我收到错误“NullReferenceException 未处理”和

1)如何克服这个?根据我的研究,它与初始化有关,但无法实现。我调试并观察了所有按钮获取的值都为空值是因为这个吗?我该如何解决?该怎么办?要添加哪个代码?

(***欢迎所有有关类初始化和数组以及空内容的通知知识。我想了解所有要点并想成为专家:P,人们也可以优化代码。欢迎提供所有额外信息。)

2)为什么编译器不显示错误但运行代码时出现错误?

好的,现在我有代码了

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace temp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Button[] btn = new Button[5];

            for (int i = 0; i < 5; i++)
            {
                btn[i] = new Button();
                btn[i].Width = 50;
                btn[i].Height = 50;
                flowLayoutPanel1.Controls.Add(btn[i]);
                btn[i].Click += new EventHandler(btn_Click);
            }
        }

        void btn_Click(object sender, EventArgs e)
        {
            Button[] btn = sender as Button[];
            btn[3].Text = "button name changed";  // here problems occurs
            //btn[3].BackColor = Color.Red;   // here problems occurs
            // btn[3].PerformClick();    // here problems occurs
        }
    }
}
4

4 回答 4

3

它应该是:

void btn_Click(object sender, EventArgs e)
{
    Button btn = sender as Button;
    btn.Text = "button name changed";  // here problems occurs
}

发件人是按钮本身,而不是数组

根据评论更新:

你应该这样做:

public partial class Form1 : Form
{
    private Button[] m_ButtonsArray;

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        m_ButtonsArray = new Button[5];

        for (int i = 0; i < 5; i++)
        {
            m_ButtonsArray [i] = new Button();
            m_ButtonsArray [i].Width = 50;
            m_ButtonsArray [i].Height = 50;
            flowLayoutPanel1.Controls.Add(m_ButtonsArray [i]);
            m_ButtonsArray [i].Click += new EventHandler(btn_Click);
        }
    }

    void btn_Click(object sender, EventArgs e)
    {
        m_ButtonsArray[3].Text = "button name changed";  // here problems occurs
    }
}

更新 - 单击第 5 个按钮时更改第 2 个按钮:

public partial class Form1 : Form
{
    private Button[] m_ButtonsArray;

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        m_ButtonsArray = new Button[5];

        for (int i = 0; i < 5; i++)
        {
            m_ButtonsArray [i] = new Button();
            m_ButtonsArray [i].Width = 50;
            m_ButtonsArray [i].Height = 50
            m_ButtonsArray [i].Tag = i;;
            flowLayoutPanel1.Controls.Add(m_ButtonsArray [i]);
            m_ButtonsArray [i].Click += new EventHandler(btn_Click);
        }
    }

    void btn_Click(object sender, EventArgs e)
    {
        Button btn = (Button)sender;
        if (((int)btn.Tag) == 5)
        {
           m_ButtonsArray[2].Text = "your text here";
        }
    }
}

解释:当我创建按钮时,我将索引添加为标签(按钮知道它是具有Tag属性的索引)当单击按钮时,我检查发送者对象 - 将其转换为Button,以获取保存在Tag. 如果Tag值为 5,那么我引用第二个按钮(虽然我可以引用它m_ButtonsArray)并更改它的值

于 2012-06-25T11:19:39.360 回答
1

你也可以这样解决...... eyossi的解决方案非常相似

公共部分类Form1:Form {私有

public Form1()
{
    InitializeComponent();
}
Button[] m_Buttons = Array new Button[5];

private void Form1_Load(object sender, EventArgs e)
{
    for (int i = 0; i < 5; i++)
    {
        m_ButtonsArray [i] = new Button();
        m_ButtonsArray [i].Width = 50;
        m_ButtonsArray [i].Height = 50;
        flowLayoutPanel1.Controls.Add(m_ButtonsArray [i]);
        m_ButtonsArray [i].Click += new EventHandler(btn_Click);
    }
}

void btn_Click(object sender, EventArgs e)
{
    m_ButtonsArray[3].Text = "button name changed";  // here problems occurs
}

}

于 2012-06-25T14:08:33.030 回答
0

这段代码是问题开始的地方:

Button[] btn = sender as Button[];

在编译时,编译器没有任何迹象表明senderof 类型object不会转换为Buttons 数组。但是在运行时它不会这样转换,因为它不是一个数组。这只是一个Button

Button btn = sender as Button;

处理程序方法 ( btn_Click) 不是同时处理所有按钮,而是单独处理每个按钮。单击按钮时,该按钮本身会调用处理程序方法。

于 2012-06-25T11:21:35.073 回答
0

(其他人已经正确回答了为什么抛出此异常)

编译器无法显示该错误,因为您正在强制将as对象强制转换(使用)到其他对象。编译器不知道对象是什么,因此不知道会发生错误。

如果您在代码中手动调用该方法并将按钮数组作为第一个参数传递给它,则代码不会崩溃。

在这种情况下,一件好事是使用标准强制转换而不是as抛出的异常会更加明确,并且会发生在正确的行上,而不是让空值传播并在后面失败。

对您的代码的一个小注释是您的数组是无用的,您不会在任何地方使用它,并且一旦加载函数完成执行,它将从内存中删除(不完全是,但如果您愿意,您可以阅读有关垃圾收集器的信息更多细节)。

于 2012-06-25T11:26:14.503 回答