【问题标题】:Copying values from dynamic textbox to jagged array error将值从动态文本框复制到锯齿状数组错误
【发布时间】:2015-05-19 08:14:20
【问题描述】:

如何将动态文本框中的值复制到锯齿状数组中?我尝试使用 for 循环,但我不断收到此错误消息:“对象引用未设置为对象的实例。”可能是什么问题?(文本框也是用锯齿状数组制作的)这是完整的代码,您可以在 button1 事件处理程序的第一行中找到有问题的行link

for (int a = 0; a < nr; a++)
         {
             for (int b = 0; b < nr+ 1; b++)
             {
                 array[a][b] =int.Parse(TB[a][b].Text);
             }
         }

(这是完整的代码:)

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;
using System.IO;

namespace WindowsFormsApplication1
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }



           int ismeretlen = 2;
            TextBox[][] TB;
            string file = "3ismeretlen.dat";



        private void Form2_Load(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            int[][] egyenletek = new int[ismeretlen][];

             for (int a = 0; a < ismeretlen; a++)
             {
                 for (int b = 0; b < ismeretlen + 1; b++)
                 {
                     egyenletek[a][b] =int.Parse(TB[a][b].Text);

                 }
             }

            int változószám = TB[0].Length;
            for (int i = 0; i < változószám - 1; i++)
            {
                for (int j = i; j < változószám - 1; j++)
                {
                    int[] d = new int[változószám];
                    for (int x = 0; x < változószám; x++)
                    {
                        if (i == j && egyenletek[j][i] == 0)
                        {
                            bool changed = false;
                            for (int z = egyenletek.Length - 1; z > i; z--)
                            {
                                if (egyenletek[z][i] != 0)
                                {
                                    int[] temp = new int[változószám];
                                    temp = egyenletek[z];
                                    egyenletek[z] = egyenletek[j];
                                    egyenletek[j] = temp;
                                    changed = true;
                                }
                            }
                            if (!changed)
                            {
                                textBox1.Text += "Az egyenletrendszernek nincs megoldása!\r\n";
                                return;
                            }
                        }

                        if (egyenletek[j][i] != 0)
                        {
                            d[x] = egyenletek[j][x] / egyenletek[j][i];
                        }
                        else
                        {
                            d[x] = egyenletek[j][x];
                        }
                    }
                    egyenletek[j] = d;
                }
                for (int y = i + 1; y < egyenletek.Length; y++)
                {
                    int[] f = new int[változószám];
                    for (int g = 0; g < változószám; g++)
                    {
                        if (egyenletek[y][i] != 0)
                        {
                            f[g] = egyenletek[y][g] - egyenletek[i][g];
                        }
                        else
                        {
                            f[g] = egyenletek[y][g];
                        }
                    }
                    egyenletek[y] = f;
                }
            }
            double val = 0;
            int k = változószám - 2;
            double[] eredmény = new double[egyenletek.Length];
            for (int i = egyenletek.Length - 1; i >= 0; i--)
            {
                val = egyenletek[i][változószám - 1];
                for (int x = változószám - 2; x > k; x--)
                {
                    val -= egyenletek[i][x] * eredmény[x];
                }
                eredmény[i] = val / egyenletek[i][i];
                if (eredmény[i].ToString() == "NaN" || eredmény[i].ToString().Contains("Végtelen sok megoldás."))
                {
                    textBox1.Text += "Az egyenletrendszernek nincs megoldása!\n";
                    return;
                }
                k--;

                TextBox[] megoldás = new TextBox[ismeretlen];

                for (int b = 0; b < ismeretlen; i++)
                {

                    megoldás[b] = new TextBox();
                    megoldás[b].BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
                    megoldás[b].Left = 536+ b * 36;
                    megoldás[b].Top = 36 * b + 10;
                    megoldás[b].Width = 35;
                    megoldás[b].Font = new Font(megoldás[b].Font.FontFamily, 16);
                    megoldás[b].BackColor = Color.Cyan;
                    megoldás[b].TextAlign = HorizontalAlignment.Center;
                    megoldás[b].Text = eredmény[ismeretlen - 1].ToString();
                    this.panel1.Controls.Add(megoldás[b]);

                }
                FileStream fs = new FileStream(file, FileMode.Create);
                BinaryWriter bw = new BinaryWriter(fs);
                for (int r = 0; r < ismeretlen; r++)
                    for (int t = 0; t < ismeretlen + 1; t++)
                        bw.Write(egyenletek[r][t]);

                bw.Close();
                fs.Close();


            }
        }

        private void numericUpDown1_ValueChanged(object sender, EventArgs e)
        {


            numericUpDown1.Maximum = 6;
            numericUpDown1.Minimum = 2;



        }

        private void Generál_Click(object sender, EventArgs e)
        {

        this.panel1.Controls.Clear();


        ismeretlen = (int)numericUpDown1.Value;

        TB = new TextBox[ismeretlen][];

        for(int i = 0; i < ismeretlen; i++)
            TB[i] = new TextBox[ismeretlen + 1];


        int height = 20;
        int width = 40;
        int curX = 10;
        int curY = 10;
        for(int i = 0; i < ismeretlen; i++)
        {
            for(int j = 0; j < ismeretlen + 1; j++)
            {
                TextBox txtbox = new TextBox();
                txtbox = new TextBox();
                txtbox.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
                txtbox.Left = curX;
                txtbox.Top = curY;
                txtbox.Width = width;
                txtbox.Height = height;
                txtbox.Font = new Font(txtbox.Font.FontFamily, 16);
                txtbox.BackColor = Color.Azure;
                txtbox.TextAlign = HorizontalAlignment.Center;

                TB[i][j] = txtbox;
                this.panel1.Controls.Add(TB[i][j]); // Add as a child of panel

                curX += width + 15;
            }

            curX = 10;
            curY = curY + height + 20;
            }

        }

        private void Ment_Click(object sender, EventArgs e)
        {

        }

    }
}

【问题讨论】:

  • 嗨!我在 Microsoft Visual c# 中制作了一个线性方程求解器程序,这对我来说是一个学期的学校项目。代码的另一半不是那么有趣,我使用了一个使用锯齿状数组的算法(我已经尝试过它并且它有效)并且我有一个按钮用于为 n 变量和 konstant 动态制作文本框。(我会评论它这里)。最大的问题是我也不太明白错误信息,因为英语不是我的母语。
  • 错误信息显示“你指的这个东西?它不存在,那里什么都没有。”
  • 谢谢你!这是完整代码link
  • 这对您有帮助吗? microsoft.com/hu-hu/download/details.aspx?id=23682这是Visual Studio 2010的语言包,所以字幕显示为匈牙利语。
  • 语言包可能会对您有所帮助。通常,如果它说对象引用未设置为对象的实例,则您正在尝试在不存在的对象上调用方法(它为空)。这是第 9 频道的视频,显示 how to debug with visual studio

标签: c# arrays


【解决方案1】:

在这行代码中,您只初始化了数组的第一个维度:

int[][] egyenletek = new int[ismeretlen][];

但是你在几行之后初始化第二个维度之前使用它(所以这个维度是空的(一个没有设置为引用的对象)):

egyenletek[a][b] =int.Parse(TB[a][b].Text);

在该行之前,您应该以某种方式初始化第二维。您在 jsfiddle 链接的 172-173 行中的另一部分代码中执行了此操作。

一般来说,当您看到此错误时,您应该评估您正在读取和分配的对象,并确保它们已被初始化(即它们不为空)。

【讨论】:

  • 哦,我明白了。现在我尝试使用与文本框相同的方式进行初始化(for (int i = 0; i
  • 如果您在 Visual Studio 中,您可以尝试暂停它并查看代码在给定时间的位置。如果您按照此代码仔细考虑您的逻辑,也许您可​​以以某种方式简化它。如果我的答案是正确的,我认为您的问题将与this question 重复
  • 我明白了,这是你所说的主要问题。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-17
  • 2011-02-02
  • 2015-10-18
  • 2014-03-16
  • 2014-12-22
相关资源
最近更新 更多