2011-03-24 180 views
0

嘿! 我想创建一个字段数组。但是,我的代码返回以下错误:字段'WindowsFormsApplication1.Form1.fieldArray'永远不会分配给,并且将始终将其默认值为null。C#创建字段数组

任何建议我如何解决这个错误?

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 Form1 : Form 
    { 
     private Field[] fieldArray; 
     private Field f; 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void populateTree(string path, TreeNode tv1) 
     { 
      string[] dir = Directory.GetDirectories(path); 
      foreach (string d in dir) 
      { 
       string entry = Path.GetFileName(d); 
       TreeNode t = tv1.Nodes.Add("Folder", entry, 0); 
       populateTree(d, t); 
      } 
      string[] files = Directory.GetFiles(path); 
      foreach (string f in files) 
      { 
       string entry = Path.GetFileName(f); 
       tv1.Nodes.Add(f, entry, 1); 
      } 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      //populate the tree 
      TreeNode t = treeView1.Nodes.Add("Units"); 
      populateTree(@"..\units\", t); 

      f = new Field(); 

      for (int i = 0; i < 10; i++) 
      { 
       fieldArray[i] = new Field(); 
      } 

      fieldArray[1].label.AutoSize = true; 
      fieldArray[1].label.Location = new System.Drawing.Point(323, 9); 
      fieldArray[1].label.Name = "Programtittle"; 
      fieldArray[1].label.Text = "UAI UnitDef Editor"; 
      this.Controls.Add(fieldArray[1].label); 

      int clabel = 36; 
      //fieldArray[1].varName = new string[] { "unitName", "name", "description" }; //define labels 

      //popluate label 
      for (int i = 1; i < fieldArray[i].varName.Length; i++) 
      { 
       fieldArray[i].label = new Label(); 
       fieldArray[i].label.AutoSize = true; 
       fieldArray[i].label.Location = new System.Drawing.Point(323, clabel); 
       fieldArray[i].label.Name = "label"; 
       this.Controls.Add(fieldArray[i].label); 
       fieldArray[i].label.Text = fieldArray[i].varName[i]; 
       clabel = clabel + 26; 
      } 

      //populate textbox 
      int cbox = 33; 
      for (int i = 0; i < fieldArray[i].varName.Length; i++) 
      { 

       fieldArray[i].txtBox = new TextBox(); 
       fieldArray[i].txtBox.Location = new System.Drawing.Point(380, cbox); 
       fieldArray[i].txtBox.Name = "txtBox"; 
       fieldArray[i].txtBox.Size = new System.Drawing.Size(100, 50); 
       this.Controls.Add(fieldArray[i].txtBox); 

       cbox = cbox + 26; 
      } 
     } 

     private void populateLabelTxtBox(string path) 
     { 
      //f.txtBox.Multiline = true; //added for testing purpose; 

      //read,split file 
      string text = System.IO.File.ReadAllText(path); 

      char[] delimiters = new char[] { '{', '=', ';', '}' }; 
      string[] parts = text.Split(delimiters, StringSplitOptions.RemoveEmptyEntries); 

      for (int i = 0; i < parts.Length; i++) 
      { 
       fieldArray[i].txtBox.Text = parts[i]; 
      } 
     } 

     private void treeView1_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e) 
     { 
      if (treeView1.SelectedNode.Name != "Folder") 
      { 
       string text = System.IO.File.ReadAllText(treeView1.SelectedNode.Name); 
       //f.txtBox.Text = text; 
       populateLabelTxtBox(treeView1.SelectedNode.Name); 
      } 
     } 
    } 
} 
+0

嘿!我尝试了你一直建议的!但是在fieldArray [0] .label = new Label();它会返回一个错误,指出对象引用未设置为对象的实例。有什么建议么? – New27 2011-03-25 01:05:31

回答

2

你永远不会初始化fieldArray

//Change 
private Field[] fieldArray; 

private Field[] fieldArray = new Field[10]; 
2

你永远不会初始化fieldArray。在您的窗体的构造函数中,像fieldArray = new Field[10];应该这样做。

1

之前您尝试访问的元素在fieldArray你必须初始化数组,像这样:

fieldArray = new Field[/*size of the array*/]; 

但是,要小心创造足够大的存储所有领域的数组。假设你创建一个由5个元素组成的Field [5]数组,并且你试图给fieldArray [5]赋值,你将得到一个OutOfBounds异常。

0

初始化您的数组,当你把它声明:

private Field[] fieldArray = new Field[100]; // size == 100 
1

做你的循环,你初始化数组中的每个元素之前,你需要初始化数组本身:

fieldArray = new Field[10]; // Create this with the appropriate size 
for (int i = 0; i < 10; i++) 
{ 
    fieldArray[i] = new Field(); 
} 

在不同的注意,你从来没有真正设置fieldArray[0] - 我怀疑你的代码明确设置fieldArray[1].XXX应该在元素0上工作。

3

列表可能比数组更容易,但是:将项目分配给空数组;一旦你知道你所需要的数量,首先创建数组:

fieldArray = new Field[10];       
for (int i = 0; i < 10; i++) 
{...} 

不过,我个人会使用一个列表:

private readonly List<Field> fields = new List<Field>(); 
... 
fields.Add(someField); 
0

我没有看到该数组分配任何行:像

int number_of_elements = 100; 
fieldArray = new Field[number_of_elements]; 

如果字段的数目是动态的,我会用一个ArrayList,像

列表fieldArray =新列表();

,然后添加元素到它:

fieldArray.Add(...) 
0

您必须初始化数组

fieldArray = new Field[10]; 
0
fieldArray[i] = new Field(); 

上面的代码使你认为该阵列已经被初始化,但实际上它有不。你需要像下面这样为数组分配一些内存。

fieldArray = new Field[/*length or size*/];