1

リストの 2 番目の項目にアクセスできません。助けを求める理由がわかりません。

class Datapoints
    {
        List<Datapoint> datapoints;                                         //Creates a list of datapoints from Datapoint
        private string fileName;
        public string Filename { get { return fileName; } }

        public Datapoint GetDatapoint(int i)                                //Creates an instance of a Datapoint called GetDatapoint                        
        {
            if (i < datapoints.Count)
                return datapoints[i];
            else
                return null;
        }

        public Datapoints(string fName)                                     //Method that creates a new list of datapoints with the objects of Datapoint within it
        {
            this.fileName = fName;
            datapoints = new List<Datapoint>();
            TextReader tr = new StreamReader(fileName);
            string input;
            while ((input = tr.ReadLine()) != null)
            {
                string[] bits = input.Split(',');
                Datapoint a = new Datapoint(bits[0], bits[1], bits[2]);
                datapoints.Add(a);
            }
            tr.Close();

        }

これがフォームです。私が実現しようとしているのは、次のボタンを押すと、ボックスにファイル内の 3 つの数字が表示されるようにすることです。

private void InitTextBoxes()
        {
            if (myDatapoints.Count > 0)
            {
                Datapoint a = myDatapoints.getItem(0);
                textBoxLatitude.Text = a.Latitude;
                textBoxLongtitude.Text = a.Longtitude;
                textBoxElevation.Text = a.Elevation;
                buttonNext.Enabled = true;
                buttonPrevious.Enabled = true;
            }
            count = 0;
            textBoxLatitude.Enabled = false;
            textBoxLongtitude.Enabled = false;
            textBoxElevation.Enabled = false;
            buttonDone.Visible = false;
            buttonDone.Enabled = false;
            addingData = false;
            saved = true;
            openToolStripMenuItem.Enabled = false;
        }


        private void openToolStripMenuItem1_Click(object sender, EventArgs e)
        {

            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Filter = "Csv Files (*.csv)|*.csv|Text files (*.txt)|*.txt|All files (*.*)|*.*";
            if (ofd.ShowDialog(this).Equals(DialogResult.OK))
            {
                myDatapoints = new Datapoints(ofd.FileName);
                this.Text = "Data Entry - " + ofd.SafeFileName;
                InitTextBoxes();
                if (myDatapoints.Count > 0)
                {
                    buttonNext.Enabled = true;
                    buttonPrevious.Enabled = true;
                    closeToolStripMenuItem.Enabled = true;
                    saveAsToolStripMenuItem.Enabled = true;
                }
            }

        }



        private void buttonNext_Click(object sender, EventArgs e)
        {


                count++;
                if (count == myDatapoints.Count)
                    count = 0;

            Datapoint a = myDatapoints.getItem(count);
            textBoxLatitude.Text = a.Latitude;
            textBoxLongtitude.Text = a.Longtitude;
            textBoxElevation.Text = a.Elevation;

            textBoxTest.Text = Convert.ToString(myDatapoints.Count);

        }

        private void buttonPrevious_Click(object sender, EventArgs e)
        {

        } 

また、ボックスを開始すると、datapoints.GetItem を (0) 以外に変更できません。次の行にエラーがあるかのように、これが問題の核心だと思いますが、理由がわかりません。エラーは

オブジェクト参照がオブジェクト インスタンスに設定されていません。

テストに使用しているファイル内には 9 つの数字 (1、2、3、4、5、6、7、8、9) があるため、1 を選択すると真ん中の 3 つを取る必要がありますが、そうではありません!

 internal Datapoint getItem(int p)
        {
            if (p < datapoints.Count)
            {
                return datapoints[p];
            }
            else
                return null;
        }
4

1 に答える 1

0

データポイントコンストラクターでは、最初の3つだけを保存しています(ファイルに1行しか含まれていない場合)

ファイル形式を変更して、1 行に 3 つの数字のみを含めるようにします。例:
1,2,3
4,5,6
7,8,9

またはロジックを変更して、単一行のすべての値を保存します。

   while ((input = tr.ReadLine()) != null)
        {
            string[] bits = input.Split(',');
            if (bits.Length % 3 != 0)
            {
               //error bad file 
            }
            else
            {
               int count = bits.Length / 3;
               int i = 0;
               while (count > 0)
               {
                   Datapoint a = new Datapoint(bits[i], bits[i+1], bits[i+2]);
                   datapoints.Add(a);
                   i += 3;
                   count--;
               }
             }
        }
于 2012-12-13T19:27:28.327 に答える