【问题标题】:Accessing List\Array between Classes在类之间访问 List\Array
【发布时间】:2016-11-15 22:51:31
【问题描述】:

我在 C# 中创建了一个带有几个按钮和文本框的简单表单。用户将输入各种详细信息,例如项目描述和代码号、输出文件位置等。

最终用户将启用一个浏览按钮,以允许他/她选择报告所在的输入目录。

浏览按钮使用 FolderBrowserDialog 并检查结果。如果结果没问题,那么我使用 locationArray = Directory.GetFiles(fbd.SelectedPath, "*.txt");

创建了一个包含所有文件路径的数组

该类被定义为 public void。

我的计划是在完成按钮中添加一些脚本,然后该按钮将遍历数组,提取文件名,读取每个文件的内容并生成包含各种详细信息的报告。

我遇到的问题是我似乎无法访问另一个类中的数组(完成按钮)。

我已经在类之前定义了数组——string[] locationArray;

然后使用类,我使用文件路径填充数组,如下所示:

locationArray = Directory.GetFiles(fbd.SelectedPath, "*.txt");

在这个阶段,我知道数组正在被填充,因为我已经显示了数组的长度。

有人可以建议我如何访问不同类下的数组,以便我可以遍历它。

提前致谢。

更具体地说,我的代码如下所示:

    string[] locationArray; 

    public void button1_Click_1(object sender, EventArgs e)
    {
        FolderBrowserDialog fbd = new FolderBrowserDialog(); 

        fbd.Description = "Browse Directory";

        if (fbd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
        {
            locationArray = Directory.GetFiles(fbd.SelectedPath, "*.txt");              
        }
        FinishButton.Enabled = true; 
    }

试图在此处访问 locationArray:

    private void button1_Click(object sender, EventArgs e)
    {

        string sProjectName = ProjectName.Text;
        string sProjectNumber = ProjectNumber.Text;
        string sOutputDirectory = OutputDirectory.Text;

        const string message1 = "Done!";
        const string caption1 = "Completed";
        var result = MessageBox.Show(message1, caption1,
                                     MessageBoxButtons.OK,
                                     MessageBoxIcon.Information);

        if (result == DialogResult.OK)
            Environment.Exit(0);
    }

希望这能让它更清楚。

汤姆

【问题讨论】:

  • 请不要发布您的代码描述。只需发布相关的代码。
  • 这里有很多关于在表单之间传递数据的答案。在不局限于列表或数组的情况下进行更多搜索,看看是否找不到好的答案。
  • 命名空间 Generic_Reconciliation_Report { public partial class ReportFormDesign : Form { public ReportFormDesign() { InitializeComponent(); }
  • 我指的是 InitializeComponent() 的内容。您可以在 Designer.cs 部分类中找到它,单击表单箭头即可访问该类:pasteboard.co/rHBzUzfHb.png
  • @DStanley - 感谢您的评论。不太确定是否有其他方法。我需要存储文件名和路径,以便稍后根据单个文件名进行一些检查。

标签: c# arrays


【解决方案1】:

我认为您对这些术语有些困惑。您粘贴的实际上是方法,而不是类。如果你想在它们之间共享一个变量,最好的方法是创建一个属性。所以我假设你真正的班级有这两个事件......我会添加这样的东西。

public class Form1: Form { // this should be already in your code... either form or webform
  public string[] LocationArray {get; set};


public void button1_Click_1(object sender, EventArgs e)
    {
      this.LocationArray = ['a', 'b']; // or whatever variable
    }

 private void button1_Click(object sender, EventArgs e)
    {
    var array = this.LocationArray; // you do not need to create an extra variable, this is only a way to reference it
    }
}

作为免费的附加建议:确保在向对象添加代码之前重命名对象,这样您就不会得到奇怪的命名约定 button1_Click,但您可以使用更有意义的 btnSave_Click。从这个类之外访问相同的属性也很容易。如果是这种情况,只需 ping 我,我也可以用它来更新答案。

【讨论】:

  • 感谢大卫。添加代码后,我意识到这一点。一旦启动并运行,我将克隆解决方案并使用正确的命名约定。
【解决方案2】:

看来问题是你先点击button1,而当时你还没有初始化locationArray。为了避免这个错误,像这样初始化locationArray

    public ReportFormDesign()
    {
        InitializeComponent();
        this.locationArray = new string[0];
    }

还要记住Environment.Exit() 有时会抛出Win32Exception。 改用Application.Exit() 如果每次单击button1 时都退出应用程序,则可以代替初始化locationArray 替换这两行

string test = Convert.ToString(locationArray.Length);
MessageBox.Show(test);

MessageBox.Show(0);

但这取决于你的意图。

【讨论】:

  • 感谢所有 cmets。我会尝试所有建议并报告。
  • 好东西。它有效,现在我可以访问数组的内容。 Visual Studio 抱怨“这个”并要求删除哪个有效。再次感谢。
  • 很高兴能帮上忙。 “this”对于 VS 来说是多余的,但是像 Resharper 这样的一些工具推荐它作为一种方法来了解你的变量是来自类还是方法的本地。
猜你喜欢
  • 2015-12-20
  • 2015-04-13
  • 1970-01-01
  • 2021-07-03
  • 1970-01-01
  • 2016-08-26
  • 1970-01-01
  • 2018-08-30
  • 1970-01-01
相关资源
最近更新 更多