C# 从另一个类访问类中的列表
我知道以前有人问过这个问题,但我似乎不明白 我有一个从datagridview生成列表的类。我想在另一个类中处理此列表,但我无法访问它。我可以从Form1.cs访问它,就像下面的代码一样。如何从Form1.cs中的随机类访问列表C# 从另一个类访问类中的列表,c#,list,class,datagridview,C#,List,Class,Datagridview,我知道以前有人问过这个问题,但我似乎不明白 我有一个从datagridview生成列表的类。我想在另一个类中处理此列表,但我无法访问它。我可以从Form1.cs访问它,就像下面的代码一样。如何从Form1.cs中的随机类访问列表 //Opens the file dialog and assigns file path to Textbox OpenFileDialog browseButton = new OpenFileDialog(); private void b
//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; }
}
}
在form1或BridgeMetry中,我的项目中称之为BridgeMetry,这给了我一个超出范围的例外
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;
}
我认为您正在尝试直接在类中访问变量;这是行不通的。试着跟随
class GetKoord
{
GetVertElementasList getList = new GetVertElementasList();
public void foo()
{
var TEST = getList.vertList(vertElementerDgv);
MessageBox.Show(TEST[5].p2.ToString());
}
}
我测试了你的代码,它似乎起了作用。我给你和@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
}
致@Grohl EDIT2:
看到您试图在不检查数据是否存在的情况下读取数据时,会感到痛苦。在这种情况下,请检查
像这样:
if(TEST.Count() >= 3)
{
MessageBox.Show(TEST[2].elNr.ToString());
}
它应该在运行时顺利调试。我认为你的问题是获取数据。
请确保加载所需的数据并检查它是否为
null
请从POST中删除不相关的代码它们是否属于同一程序集?请尝试阅读以下内容:我认为您在访问不同的数据类型和属性时遇到了一些问题。您必须指定不相关的代码@un-lucky.same assembly@A什么是程序集?通过这个,我可以访问列表,但无法访问datagridview vertElementerDgv,它是以form1.cs[设计]的形式以图形方式制作的。修改器i设置为public.bridgeometry obj=新bridgeometry();public void foo(){var TEST=getList.vertList(obj.vertElementerDgv);MessageBox.Show(TEST[5].elNr.ToString());}现在我在mscorlib.dll中得到一个“System.ArgumentOutOfRangeException”。附加信息:索引超出范围。必须为非负数且小于集合的大小。可能是因为在测试[5]中没有任何值,所以我确信在运行代码时在此位置获得了值。@Grohl是否确定在MessageBox.Show(测试[2].elNr.ToString())中代码>测试[索引]
够了吗?设置断点并查看计数属性。尽量不要使用硬编码的索引号。它似乎是在将值写入datagridview之前读取它?我会做一个编辑2来显示问题和我不明白的地方。是的,没错。问题是从datagriview获取数据。对不起,我没有正确地解释这一点。您知道如何从datagridview传递数据吗?
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();
}
}
if(TEST.Count() >= 3)
{
MessageBox.Show(TEST[2].elNr.ToString());
}