从另一个类中的数组中读取数据

时间:2013-03-11 10:37:01

标签: c#

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

包含的示例:我需要将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]); //
    }

5 个答案:

答案 0 :(得分: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);
        }
    }

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

答案 1 :(得分: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]); //
    }
}

答案 2 :(得分:1)

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

您必须将声明置于方法之外:

public class Parsedata
{
    public string[,] ParticipantX;

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

我已将ParticipantX标记为public,以便您可以从表单中访问它:

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

更好的方法是使其成为公共财产:

private string[,] _participantX;
public string [,] ParticipantX
{
    get { return _participantX; }
}

答案 3 :(得分: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

答案 4 :(得分:-1)

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

var pd = new ParseData();

然后你可以使用:

pd.Participant(...);