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 に答える