【问题标题】:Access list in class from another class来自另一个班级的班级访问列表
【发布时间】:2017-06-20 12:58:11
【问题描述】:

我知道以前有人问过这个问题,但我似乎无法弄清楚。

我有一个类可以从数据网格视图中创建一个列表。我想在另一个班级中处理这个列表,但我无法访问它。我可以像下面的代码一样从 Form1.cs 访问它。如何像在 Form1.cs 中一样从随机类访问列表?

    //Opens the file dialog and assigns file path to Textbox
    OpenFileDialog browseButton = new OpenFileDialog();
    private void browse_Click(object sender, EventArgs e)
    {

        browseButton.Filter = "Excel Files |*.xlsx;*.xls;*.xlsm;*.csv";
        if (browseButton.ShowDialog() == DialogResult.OK)
        {
            ExcelPath.Text = browseButton.FileName;
            fileExcel = ExcelPath.Text;
            //SetAttributeValue(ExcelPath, fileExcel);
            //nylp();

            /*
            ////IMPORTERER 10TAB-DATA FRA EXCEL TIL DATAGRIDVIEW////
            tenTabLine.fileExcel = fileExcel;
            tenTabLine.tenTab(tenTabDgv);
            */            

            ////IMPORTERER NYLPDATA TIL DATAGRIDVIEW////
            nylpLine.fileExcel = fileExcel;
            nylpLine.nylpData(nylpDgv);

            ////TAR DATA I NYLPDGV DATAGRIDVIEW OG BEREGNER VERTIKALE ELEMENTER////
            vertElementer.vertBueDGV(nylpDgv, vertElementerDgv);


            GetVertElementasList getList = new GetVertElementasList();
            var TEST = getList.vertList(vertElementerDgv);
            MessageBox.Show(TEST[5].p2.ToString());

        }
        else return;
    }

当我尝试做这样的事情时,我在错误列表中得到很多错误:

class GetKoord
{
    GetVertElementasList getList = new GetVertElementasList();
    var TEST = getList.vertList(vertElementerDgv);

    MessageBox.Show(TEST[5].p2.ToString());


}

这是我的列表类

class GetVertElementasList
{


    private List<vertEl> vertElementList = new List<vertEl>(); 

    public List<vertEl> vertList(DataGridView VertElementer)
    {
        for (int i = 0; i<VertElementer.Rows.Count - 1; i++)
        {
            vertElementList.Add(new vertEl
            {
                elNr = (int)VertElementer.Rows[i].Cells[0].Value,
                p1 = (double)VertElementer.Rows[i].Cells[1].Value,
                p2 = (double)VertElementer.Rows[i].Cells[2].Value,
                z1 = (double)VertElementer.Rows[i].Cells[3].Value,
                z2 = (double)VertElementer.Rows[i].Cells[4].Value,
                heln1 = Convert.ToDouble(VertElementer.Rows[i].Cells[5].Value),
                heln2 = (double)VertElementer.Rows[i].Cells[6].Value
            });
        }

        return vertElementList;
    }

}

public class vertEl
{
    private int _elNr;
    private double _p1;
    private double _p2;
    private double _z1;
    private double _z2;
    private double _nylpRad;
    private double _heln1;
    private double _heln2;

    public int elNr
    {
        get { return _elNr; }
        set { _elNr = value; }
    }

    public double p1
    {
        get { return _p1; }
        set { _p1 = value; }
    }

    public double p2
    {
        get { return _p2; }
        set { _p2 = value; }
    }

    public double z1
    {
        get { return _z1; }
        set { _z1 = value; }
    }

    public double z2
    {
        get { return _z2; }
        set { _z2 = value; }
    }

    public double nylpRad
    {
        get { return _nylpRad; }
        set { _nylpRad = value; }
    }

    public double heln1
    {
        get { return _heln1; }
        set { _heln1 = value; }
    }

    public double heln2
    {
        get { return _heln2; }
        set { _heln2 = value; }
    }
}

编辑:

我已经让它工作了,只是我得到了一个超出范围的异常。

类代码是:

class GetKoord
{
    public GetVertElementasList getList = new GetVertElementasList();


    BridgGeometry obj = new BridgGeometry();

    public void foo()
    {

        var TEST = getList.vertList(obj.vertElementerDgv);
        MessageBox.Show(TEST[2].elNr.ToString());
    }

}

在我的项目中调用的 form1 或 BridgGeometry 中,这给了我超出范围的异常。

  GetKoord getZ = new GetKoord();
  getZ.foo();

编辑2:

下面的代码有效,并在列表中给出了一个带有一些值的消息框。但是上面类中的方法 foo() 给出了超出范围的错误。

private void browse_Click(object sender, EventArgs e)
    {

        browseButton.Filter = "Excel Files |*.xlsx;*.xls;*.xlsm;*.csv";
        if (browseButton.ShowDialog() == DialogResult.OK)
        {


            ////TESTING////WORKING CODE AND GIVES A MESSAGEBOX WITH VALUE
            GetVertElementasList getVertList = new GetVertElementasList();
            var TEST = getVertList.vertList(vertElementerDgv);
            MessageBox.Show(TEST[2].elNr.ToString());

        }
        else return;
    }

【问题讨论】:

  • 请从帖子中删除不相关的代码
  • 它们是否属于同一个程序集?
  • 你试试看这个怎么样:msdn.microsoft.com/de-de/library/ms173121.aspx我认为你在访问不同的数据类型和属性时遇到了一些问题。
  • 你必须指定不相关的代码@un-lucky。
  • 同一个程序集? @Anand 什么是程序集?

标签: c# list class datagridview


【解决方案1】:

我认为您正在尝试直接在类中访问变量;这是行不通的。尝试关注

class GetKoord
{
     GetVertElementasList getList = new GetVertElementasList();
     public void foo()
        {
           var TEST = getList.vertList(vertElementerDgv);
           MessageBox.Show(TEST[5].p2.ToString());
        }
}

【讨论】:

  • 有了这个我可以访问列表,但我无法访问在form1.cs [设计]中以图形方式制作的datagridview vertElementerDgv。修饰符我设置为公开。
  • BridgGeometry obj = new BridgGeometry(); public void foo() { var TEST = getList.vertList(obj.vertElementerDgv); MessageBox.Show(TEST[5].elNr.ToString()); }
  • 现在我得到一个在 mscorlib.dll 中发生的“System.ArgumentOutOfRangeException”。附加信息:索引超出范围。必须是非负数且小于集合的大小。
  • 可能是因为您在 TEST[5] 中一无所获
  • 我确定我在运行代码时在这个位置得到了值。
【解决方案2】:

我测试了您的代码,它似乎有效。我给你和@Anand 的代码 没有错误,除了空列表。但那是因为我没有给它任何信息。所以,应该没有问题。

@Grohl 可能会尝试我的代码并评论显示错误的位置。这应该是最容易找到问题的方法。

TestClass 代表class GetKoord

namespace TestForm
{
    class TestClass
    {
        public TestClass()
        {
            DataGridView tmp = new DataGridView();
            GetVertElementasList getList = new GetVertElementasList();
            var TEST = getList.vertList(tmp);

            MessageBox.Show(TEST[5].p2.ToString());
        }
    }
}

GetVertElementasList

namespace TestForm
{
    class GetVertElementasList
    {
        private List<vertEl> vertElementList = new List<vertEl>();

        public List<vertEl> vertList(DataGridView VertElementer)
        {
            for (int i = 0; i < VertElementer.Rows.Count - 1; i++)
            {
                vertElementList.Add(new vertEl
                {
                    elNr = (int)VertElementer.Rows[i].Cells[0].Value,
                    p1 = (double)VertElementer.Rows[i].Cells[1].Value,
                    p2 = (double)VertElementer.Rows[i].Cells[2].Value,
                    z1 = (double)VertElementer.Rows[i].Cells[3].Value,
                    z2 = (double)VertElementer.Rows[i].Cells[4].Value,
                    heln1 = Convert.ToDouble(VertElementer.Rows[i].Cells[5].Value),
                    heln2 = (double)VertElementer.Rows[i].Cells[6].Value
                });
            }

            return vertElementList;
        }

    }
     //Some other stuff
}

最后但并非最不重要。按钮点击事件的代码:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }


    private void simpleButton1_Click(object sender, EventArgs e)
    {
        DataGridView tmp = new DataGridView();
        GetVertElementasList getList = new GetVertElementasList();
        var TEST = getList.vertList(tmp);

        MessageBox.Show(TEST[5].p2.ToString());
        TestClass tmpClass = new TestClass();
    }
}

致@Grohl EDIT2:

看到您试图读取数据而不检查是否有数据,这很令人痛心。在这种情况下,请检查!

像这样:

if(TEST.Count() >= 3)
{
    MessageBox.Show(TEST[2].elNr.ToString());
}

它应该在运行时顺利调试。我认为您的问题是获取数据。 确保您加载了所需的数据并检查它是否不是null

【讨论】:

  • @Grohl 你确定MessageBox.Show(TEST[2].elNr.ToString()); TEST[index] 够了吗?设置断点并查看计数属性。尽量不要使用硬编码的索引号。
  • 似乎是在将值写入数据之前读取数据网格视图?我会做一个 EDIT 2 来说明问题和我不明白的地方。
  • 是的,没错。问题是从 datagriview 获取数据。很抱歉没有正确解释这一点。你知道我如何从 datagridview 传递数据吗?
猜你喜欢
  • 2017-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多