当前上下文中不存在名称为XXXX的内容。

3

我有以下代码:

public Form1()
{
    InitializeComponent();


    string strRadio = Utils.ReadFile(strTemp + @"\rstations.txt");
    string[] aRadio = strRadio.Split(new string[] { "#" }, StringSplitOptions.RemoveEmptyEntries);    
    for (int i = 0; i < aRadio.Length; i += 2)
    {
       listBox.Items.Add(aRadio[i]);
    }

}

private void listBox_SelectedIndexChanged(object sender, EventArgs e)
{
    int index = listBox.SelectedIndex;
    MessageBox.Show(aRadio[(index+1)]);
}

现在的错误是 The name 'aRadio' does not exist in the current context,它来自于MessageBox.Show(aRadio[(index+1)]);。我需要将aRadio声明为公共的或者其他吗?如果需要,应该怎么做?

4个回答

21

您将aRadio声明为构造函数内的局部变量。您需要将其声明为实例变量,并在构造函数内仅分配一个值:

// TODO: Give this a better name
private readonly string[] aRadio;

// TODO: Give your form a better name too
public Form1()
{
    InitializeComponent();

    // TODO: You might want to reconsider reading files in a GUI constructor, too
    // TODO: Use Path.Combine(strTemp, "rstations.txt" instead of concatenation
    string strRadio = Utils.ReadFile(strTemp + @"\rstations.txt");
    aRadio = strRadio.Split(new string[] { "#" },
                            StringSplitOptions.RemoveEmptyEntries);

    for (int i = 0; i < aRadio.Length; i += 2)
    {
       listBox.Items.Add(aRadio[i]);
    }
}

如果你添加一个自定义对象(或只是一个 KeyValuePair<string, string>)到列表框并通过属性绑定显示部分,我不会感到惊讶,这样你就可以得到选定的 item 而不是选定的索引...没有必要像这样保留文本/值对。


你能详细说明一下你所发布的附加评论吗?你想在哪里读取文件?是在另一个线程中吗? - Devator
@Devator:可能在启动时在某个完全不同的代码中,在显示闪屏屏幕时。 这实际上取决于应用程序的其余部分。 - Jon Skeet
你应该使用 Path.Combine - user
@user:已添加一个“TODO” - 我想保持原始代码的一般性。 - Jon Skeet

2
   private string[] aRadio;

    public Form1() { 
      InitializeComponent();       
      string strRadio = Utils.ReadFile(strTemp + @"\rstations.txt");
      this.aRadio = strRadio.Split(new string[] { "#" }, StringSplitOptions.RemoveEmptyEntries);
      for (int i = 0; i < aRadio.Length; i += 2)
      {
        listBox.Items.Add(aRadio[i]);
      }
    }

    private void listBox_SelectedIndexChanged(object sender, EventArgs e) {
      int index = listBox.SelectedIndex;
      MessageBox.Show(this.aRadio[(index+1)]);
    } 

1

你需要访问在构造函数域中定义的变量form1,这样你就可以这样做:

//Define the variable as an attribute of class

private string[] strRadio;
public Form1()
{
        InitializeComponent();
        string strRadio = Utils.ReadFile(strTemp + @"\rstations.txt");
        aRadio = strRadio.Split(new string[] { "#" }, StringSplitOptions.RemoveEmptyEntries);

        for (int i = 0; i < aRadio.Length; i += 2)
        {
           listBox.Items.Add(aRadio[i]);
        }

    }

    private void listBox_SelectedIndexChanged(object sender, EventArgs e)
    {
        int index = listBox.SelectedIndex;
        MessageBox.Show(aRadio[(index+1)]);
    }
}

1
请不要像这样推荐公共字段 :( - Jon Skeet

-3

System.StringSplitOptions.RemoveEmptyEntries:按照这种方式输入,将解决你的问题。

别问我为什么,我只知道它以这种方式起作用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接