2017-02-03 5 views
-3

Ich weiß, das ist gefragt, aber ich kann nicht scheinen, es herauszufinden.Access-Liste in der Klasse von einer anderen Klasse

Ich habe eine Klasse, die eine Liste aus einem Datagridview erstellt. Ich möchte mit dieser Liste in einer anderen Klasse arbeiten, aber ich kann nicht darauf zugreifen. Ich kann es von Form1.cs wie der Code darunter zugreifen. Wie greife ich auf die Liste aus einer zufälligen Klasse wie ich in 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; 
    } 

Wenn ich versuche, so etwas zu tun, erhalte ich viele Fehler in Fehlerliste:

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

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


} 

Dies ist meine Liste Klasse

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; } 
    } 
} 

EDIT:

I Habe es jetzt gemacht, außer dass ich eine Ausnahme außerhalb des Bereichs bekomme.

Klassencode ist:

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()); 
    } 

} 

In form1 oder BridgGeometry, wie es in meinem Projekt genannt wird, ich habe was mir Ausnahme außerhalb der Reichweite gibt.

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

EDIT2:

Der Code unten arbeitet und gibt mit einem Wert in der Liste ein Meldungsfeld. Aber die Methode foo() in der Klasse oben gibt einen Fehler außerhalb des Bereichs an.

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; 
    } 
+0

Bitte entfernen Sie irrelevanten Code aus dem Post –

+0

Gehören sie zur gleichen Baugruppe? – A3006

+0

Wie wäre es, wenn Sie versuchen, dies zu lesen: https://msdn.microsoft.com/de-de/library/ms173121.aspx Ich denke, Sie haben einige Probleme mit dem Zugriff auf verschiedene Datentypen und Eigenschaften. – Cataklysim

Antwort

0

Ich denke, Sie versuchen, die Variable direkt in der Klasse zuzugreifen; was nicht funktioniert. Versuchen Sie folgendes

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

Damit kann ich auf die Liste, aber ich kann nicht auf die Datagridview VertElementerDgv zugreifen, die in form1.cs [Design] grafisch gemacht wird. Modifier ich auf öffentlich gesetzt. – Grohl

+0

BridgGeometry obj = neue BridgGeometry(); public void foo() { var TEST = getList.vertList (obj.vertElementerDgv); MessageBox.Show (TEST [5] .elNr.ToString()); } – Grohl

+0

Jetzt bekomme ich eine 'System.ArgumentOutOfRangeException' in mscorlib.dll aufgetreten. Zusätzliche Informationen: Der Index lag außerhalb des zulässigen Bereichs. Muss nicht negativ und kleiner als die Größe der Sammlung sein. – Grohl

0

Ich testete Ihren Code und es schien zu funktionieren. Mein Code für Sie und @Anand Keine Fehler, außer für leere Listen. Aber das ist, weil ich ihm keine Informationen gegeben habe. Also sollte es kein Problem geben.

@Grohl vielleicht meinen Code versuchen und kommentieren, wo der Fehler angezeigt wird. Dies sollte der einfachste Weg sein, das Problem zu finden.

TestClass die 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()); 
     } 
    } 
} 

Die 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 
} 

Last but not least stellt. der Code aus dem Button-Klick-Ereignisse:

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(); 
    } 
} 

Um @Grohl EDIT2:

Es tut weh zu sehen, dass Sie Daten zu lesen, ohne zu prüfen, versuchen, wenn es irgendein. In solchen Fällen, überprüfen Sie!

So:

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

Es befindet sich auf glatt zur Laufzeit debuggen sollte.Ich denke, dein Problem besteht darin, die Daten zu bekommen. Stellen Sie sicher, dass Sie die erforderlichen Daten laden und prüfen Sie, ob es nicht null ist.

+0

@Grohl sind Sie sicher, dass in 'MessageBox.Show (TEST [2] .elNr.ToString());' 'TEST [index]' genug? Setzen Sie einen Haltepunkt und schauen Sie sich die Zählwerte an. Versuchen Sie nicht, hart codierte Indexnummern zu verwenden. – Cataklysim

+0

Scheint so, als würde es die Datagridview lesen, bevor Werte darauf geschrieben werden? Ich werde ein EDIT 2 machen, um das Problem zu zeigen und was ich nicht verstehe. – Grohl

+0

@Grohl Ich habe auch bearbeitet – Cataklysim

Verwandte Themen