3

我需要从位于另一个类中的数组中读取数据。我已经阅读了一些解释相同问题的线程,但无法让它与我的代码一起使用......

包含的示例:我需要将ParticipantX数组中的数据从Parsedata类读取到Form1类,如我的示例所示。

如果有任何帮助,我将不胜感激。最好的办法是如果你能帮助我编写我需要的代码。我现在卡住了。谢谢。

public class Parsedata
{
    public void ParsedataMethod()
    {
    ...
        //Neccesary data are added to this array
        string[,] ParticipantX = new string[40, 4];

在同一个命名空间中,我有 Form1 类:

using Crestron.ActiveCNX;
public partial class Form1 : Form
{
    ActiveCNX cnx;
    cnx = new ActiveCNX();

    private void SerialSend_Click(object sender, EventArgs e)
    {
        int number = 8;
        for (int i = 1; i < number; i++)
            cnx.SendSerial(i, ParticipantX[i, 1]); //
    }
4

5 回答 5

2

您可以通过委托 + 事件处理程序将其传递,例如:

public partial class Form1 : Form
{
    public string[,] ParticipantX;
    public Form1()
    {
        InitializeComponent();
        Class1.SendArray += new EventHandler<MyArgs>(GetArray);
    }

    public void GetArray(object sender, MyArgs ea)
    {
        this.Invoke(new MethodInvoker(
            delegate()
            {
              ParticipantX = ea.myArray;
            }));
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        Class1 t = new Class1();
        t.ParsedataMethod();
    }
}

public class MyArgs : EventArgs
{
    public string[,] myArray { get; set; }
}

在你的解析数据类中,OnArraySend当你想将数组传递给你的表单时调用:

public static event EventHandler<MyArgs> SendArray;
    public void ParsedataMethod()
    {
        string[,] ParticipantX = new string[40, 4];
        OnArraySend(new MyArgs() { myArray = ParticipantX });
    }

    protected virtual void OnArraySend(MyArgs ea)
    {
        if (SendArray != null)
        {
            SendArray(this, ea);
        }
    }

这是一个粗略的例子,但你明白了一般的想法

于 2013-03-11T11:39:39.517 回答
1

首先,请记住,属性是类的一部分,而类具有属性(或字段)。如果没有班级所有者,您将无法获得财产。

在静态中,您可以这样实现:

public static class Parsedata{
  public static string[,] StringX{get;set;}
}

但是,当您的类和属性不是静态的时,您需要先将类实例化为一个对象。例子:

public class Parsedata{
  public string[,] StringX{get;set;}
}
public class Caller{
  Parsedata p = new Parsedata();
  public void SetStringX(string[,] stringX){
    p.StringX = stringX;
  }
  public string[,] GetStringX(){
    return p.StringX;
  }
}

但是,您必须记住,实例化对象的值在实例之间是不同的。示例(仅说明):

WebSite a = new WebSite();
a.Name = "Stack";
WebSite b = new WebSite();
b.Name = "Overflow";
Console.WriteLine(a.Name); // will result Stack
Console.WriteLine(b.Name); // will result Overflow
于 2013-03-11T10:52:43.633 回答
1

尝试这个:

public class Parsedata
{
     private string[,] m_ParticipantX;
     public void ParsedataMethod()
     {
       ...
       m_ParticipantX = new string[40, 4];//Neccesary data are added to this array
     }

     public string[,] ParticipantX
     {
          get { return m_ParticipantX; }
     }
}

using Crestron.ActiveCNX;
public partial class Form1 : Form
{
    ActiveCNX cnx;
    cnx = new ActiveCNX();
    Parsedata data = new Parsedata();

    private void SerialSend_Click(object sender, EventArgs e)
    {
        data.ParseDataMethod();
        int number = 8;
        for (int i = 1; i < number; i++)
            cnx.SendSerial(i, data.ParticipantX[i, 1]); //
    }
}
于 2013-03-11T10:42:54.610 回答
1

ParticipantX数组是在方法内声明的,这意味着它将是该方法的本地数组。

您必须将声明放在方法之外:

public class Parsedata
{
    public string[,] ParticipantX;

    public void ParsedataMethod()
    {
        ...
        ParticipantX = new string[40, 4];

我已标记ParticipantXpublic,以便您可以从表单中访问它:

ParseData parseData = new ParseData();
parseData.ParticipantX[x, y] ...

更好的方法是使其成为公共属性:

private string[,] _participantX;
public string [,] ParticipantX
{
    get { return _participantX; }
}
于 2013-03-11T10:46:50.807 回答
-1

您可以制作 Parsedata 和 ParsedataMethod 静态方法或在您的表单中创建 Parsedata 的实例:

var pd = new ParseData();

然后你可以使用:

pd.Participant(...);
于 2013-03-11T10:41:32.927 回答