none
Formuláře - předávání dat mezi formuláři

    Dotaz

  •  

    Dobrý den. Snažím se v C# vytvořit graf zpoždění-vzdálenost mezi uzly. Chci aby to fungovalo tak, že hlavní formulář má hlavní data o uzlech v síti. Má také nějaká tlačítka, jedno z nich je tlačítko Graph, které má za úkol zobrazit druhý formulář s grafem. Obsah kódu pro toto tlačítko je zobrazen níže. Landmarks je vlastně pole objektů-uzlů, pro které graf zobrazuju. delayDistanceChart je oblast pro vykreslení grafu na druhém formuláři, ale tady mi to hlásí chybu, že je delayDistanceChart nedostupný z důvodu práv. Problém jsem vyřešil tak, že jsem v GRAPHFORM.DESIGNER.CS změnil private na public a fungovalo to. Přijde mi to ale špatné řešení, takto se hrabat v designeru, který by měl pro programátora zůstat skryt. Ví prosím někdo o správném řešení? Pořád se špatně orientuju v těch právech a v projektu mám s nimi největší problémy. Nebo by bylo lepší řešení předat do formuláře graphForm rovnou celé to pole objektů landmarks a řešit to tam? Dá se to udělat? Popřípadě jak? Je to správnější? Moc děkuji za rady. Kód tlačítka:

    private void graphButton_Click(object sender, EventArgs e) { int i = 0; //graf pro uzel i GraphForm graphForm = new GraphForm(); graphForm.Show(); for (int k = 0; k < 14; k++) { graphForm.delayDistanceChart.Series["Series1"].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Point; graphForm.delayDistanceChart.Series["Series1"].Points.AddXY(landmarks[i].correlationTable[k].Distance, landmarks[i].correlationTable[k].Delay); } }


    • Upravený Efká 1. prosince 2013 9:13 chybějící slovo
    1. prosince 2013 9:12

Všechny reakce

  • Odpověděl jsi si sám - čistší je předat pole landmarks vytvořenému formuláři a to takto:

    GraphForm graphForm = new GraphForm(landmarks);

    Pak musíš upravit konstruktor GraphForm a přidat vlastnost pro uchování předané hodnoty:

    Landmarks landmarks; public GraphForm(Landmarks predaneLandmarks) {

    InitializeComponent(); this.landmarks = predaneLandmarks; }

    Není také vhodné, aby prvý formulář řídil, co se vykresluje na druhém - jen ať si to odmaká sám ten druhý. Důvod - pokud např. přidáš třetí formulář nebo kód, který také nějak sestaví seznam landmarks (např. načtením ze souboru), musel bys vykreslení psát znovu v kódu třetího formuláře. Takže kód prvého formuláře by mohl být:

    private void graphButton_Click(object sender, EventArgs e) { GraphForm graphForm = new GraphForm(landmarks); graphForm.Show(); }

    A kód druhého:

    Landmarks landmarks; public GraphForm(Landmarks predaneLandmarks) {

    InitializeComponent(); this.landmarks = predaneLandmarks; } public vykresli() { int i = 0;  //graf pro uzel i
    for (int k = 0; k < 14; k++)
    {
    graphForm.delayDistanceChart.Series["Series1"].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Point;
    graphForm.delayDistanceChart.Series["Series1"].Points.AddXY(landmarks[i].correlationTable[k].Distance, landmarks[i].correlationTable[k].Delay);
    } }

    Cest je ale více - pokud chceš pole landmarks použít i na dalších místech, můžeš jej obalit např. do statické třídy a problémy s předáváním zmizí - to už musíš popřemýšlet sám podle účelu aplikace...
    15. ledna 2014 12:35