Laden...

Übergabe von Wert an andere Klasse nicht möglich --> Zugriffsmodifizierer

Erstellt von tm64 vor 8 Jahren Letzter Beitrag vor 8 Jahren 2.840 Views
T
tm64 Themenstarter:in
23 Beiträge seit 2015
vor 8 Jahren
Übergabe von Wert an andere Klasse nicht möglich --> Zugriffsmodifizierer

Hi Leute
ich habe bisher immer kleine programme einer .cs datei geschrieben
der übersicht halber wollte ich jetzt mit mehreren .cs dateien versuchen
bekomme dort aber immer den error > Fehlermeldung:

Der Zugriff ist aufgrund der Sicherheitsebene nicht möglich

zb wenn ich aus meiner listbox "box1.SelectedIndex" verwenden möchte geht das im haupt.cs problemlos doch in einem weiteren nich

ich weiss die frage ist sicher sehr banal , hab aber bereits 2 stunden gegoogelt
hoffe jemand hilft mir trotzdem 🙂

4.939 Beiträge seit 2008
vor 8 Jahren

Hallo und willkommen,

so ähnliche Fragen gab es schon mehrmals hier, u.a. Funktion auslagern - combobox nicht bekannt

Von einer externen Klasse sollte man keinen Zugriff auf Interna (d.h. Steuerelemente (Controls)) einer Form ermöglichen. Den Wert daher am besten als Parameter an die andere Klassenmethode übergeben:


otherClass.DoSomethingWith(box1.SelectedIndex);

In die andere Richtung verwendet man dafür ein Ereignis (Event).

Zusammenfassend habe ich dies mit entsprechendem Link in Probleme mit UserControl und Form beschrieben.

T
tm64 Themenstarter:in
23 Beiträge seit 2015
vor 8 Jahren

Vielen dank für deinen post Th69
ich habe deine links gelesen aber ich muss mir eingestehen , es nicht wirklich zu verstehen

es wäre nett wenn du es mir kurz anhand meines codes erklähren könntest steh da aufn schlauch wie genau du das mit otherClass.DoSomethingWith(box1.SelectedIndex); meinst

test.cs


private void test()
        {
            if (listBox1.SelectedIndex < listBox1.Items.Count - 1)
            {
                listBox1.SelectedIndex = listBox1.SelectedIndex + 1;
            }

            WriteLog("" + listBox1.SelectedItem);

        }

versuch.cs


private void test()
        {
            if (form1.listBox1.SelectedIndex < form1.listBox1.Items.Count - 1)
            {
                form1.listBox1.SelectedIndex = form1.listBox1.SelectedIndex + 1;
            }

            WriteLog("" + form1.listBox1.SelectedItem);

        } 

hab schon viel rumprobiert bekomme leider immer den fehler > Fehlermeldung:

Der Zugriff ist aufgrund der Sicherheitsebene nicht möglich

T
64 Beiträge seit 2011
vor 8 Jahren

Deine ListBox befindet sich in einer anderen Klasse als deine test() Methode. Dein Problem mit der Sicherheitsebene liegt an so genannten Zugriffsmodifizierern. Die ListBox auf die du zugreifen möchtest ist private und kann dadurch nur innerhalb ihrer (GUI-)Klasse verwendet werden, was auch gut so ist.
Du benötigst eine weitere Klasse die als Datenhalter fungiert und in der sich alle Daten befinden die du für test() benötigst. Diese Daten sollten dabei den public modifier besitzen damit eine Kommunikation mit anderen Klassen möglich ist.
In dieser neuen Klasse kannst du die Anzahl der Items oder das aktuell ausgewählte Item als Public ablegen und deine ListBox kann problemlos in diese Variablen hineinschreiben oder sie je nach Bedarf vielleicht sogar als DataSource verwenden und deine test() Methode ist in der Lage diese auszulesen oder zu ändern.

T
tm64 Themenstarter:in
23 Beiträge seit 2015
vor 8 Jahren

Erstmal danke Toxo für deine mühe mir so einen ausführlichen text zu schreiben , da fällt es mir schwer dir jetzt zu beichten das ich wenn überhaupt nur die hälfte verstanden habe
das mit Zugriffsmodifizierern habe ich bereits gelesen und es auch mit public anstelle von privat versucht nur leider hat das nichts verändert

public void test()
        {
            if (form1.listBox1.SelectedIndex < form1.listBox1.Items.Count - 1)
            {
                form1.listBox1.SelectedIndex = form1.listBox1.SelectedIndex + 1;
            }

            WriteLog("" + form1.listBox1.SelectedItem);

        }

ich hoffe es macht dir nicht zu viele umstände , wenn ich dich bitte es mir nochmals anhand meines code beispiels zu zeigen

T
64 Beiträge seit 2011
vor 8 Jahren

Hallo tm64,

leider kann ich dir an dem Code den du gepostet hast nicht zeigen was du ändern musst. Die Methode test() von private auf public zu ändern hilft dir bei deinem Problem nicht weiter, da jetzt zwar alle anderen Klassen test() kennen und benutzen können aber deine ListBox immer noch nur innerhalb ihrer eigenen Klasse agieren kann.

Du benötigst einen Datenhalter der als public definiert wird. In diesem können deine ListBox und die test() Methode benötigte Daten reinschreiben oder lesen. Dort kannst du dann immer den SelectedIndex hineinschreiben wenn sich dieser ändert und test() ist jederzeit in der Lage diesen auszulesen.

T
tm64 Themenstarter:in
23 Beiträge seit 2015
vor 8 Jahren

ok danke für die erklährung
ich habe leider das wort Datenhalter bisher noch nie gehört deshalb wärs sehr nett wenn du mir kurz sagst wie ich den erstelle mit der listBox
hab bereits nach Datenhalter und listBox erfolglos gegogelt vermutlich ist das so einfach das es bereits jeder außer ich von grundauf weiss 😦

2.207 Beiträge seit 2011
vor 8 Jahren

Toxo meint einfach eine Klasse, die public ist, in der du etwas reinschreiben und rauslesen kannst. Da die von beiden Seiten gekannt wird fungiert sie als "Datenhalter". Das ist kein technologischer Begriff insofern, als dass man das suchen, kopieren und einfügen kann.

Das hat er aber auch geschrieben:

In dieser neuen Klasse kannst du die Anzahl der Items oder das aktuell ausgewählte Item als Public ablegen und deine ListBox kann problemlos in diese Variablen hineinschreiben oder sie je nach Bedarf vielleicht sogar als DataSource verwenden und deine test() Methode ist in der Lage diese auszulesen oder zu ändern.

T
tm64 Themenstarter:in
23 Beiträge seit 2015
vor 8 Jahren

ok danke
nach vielen test hab ich es jetzt so hinbekommen

form1.cs

   public string boxx2()
        {
            return "" + textBox2.Text;
        }

versuch.cs

WriteLog("" + form1.boxx2);

ich nehm an das ist nicht die profi lösung , aber er funktioniert

3.003 Beiträge seit 2006
vor 8 Jahren

return "" + textBox2.Text;
//..
"" + form1.boxx2

Das hier ist C#, den Hokuspokus mit ""+ kannst du dir sparen.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

2.207 Beiträge seit 2011
vor 8 Jahren

Wieso du das nicht einfach an die zweite Klasse übergibst ist mir schleierhaft.

Irgendwo musst du ja deinen Versuch.cs erstellen. Da hast du eine Methode, in der du den Wert von deiner Textbox nutzen magst. In diese Methode übergibst du einfach dein textBox2.Text. Versuch.cs ist public.

T
tm64 Themenstarter:in
23 Beiträge seit 2015
vor 8 Jahren

Wieso du das nicht einfach an die zweite Klasse übergibst ist mir schleierhaft.

Irgendwo musst du ja deinen Versuch.cs erstellen. Da hast du eine Methode, in der du den Wert von deiner Textbox nutzen magst. In diese Methode übergibst du einfach dein textBox2.Text. Versuch.cs ist public.

ich hoffe du bist mir nicht böse wenn ich dir sage das ich einfach nicht weiss wie man eine methode übergibt

wenn du mir anhand eines bsp codes zeigst was ich da genau in versuch.cs schreiben muss wäre ich dir sehr dankbar und würde es dann sicher mal verstehen , das is sicher nur 1 zeile oder so

ich habe eigl noch 1-2 kleine fragen , die ich mich aber gar nicht zu stellen traue 😄
ganz erlich ich habe bereits knapp 2 jahre gebraucht bis mein erstes kleines prog gelaufen ist - in meinem alter geht alles etwas langsamer dafür ist die freude umso grösser wenn mal was klappt 😃

T
64 Beiträge seit 2011
vor 8 Jahren

Du musst keine Methode übergeben sondern nur den Inhalt der TextBox an die Versuch Klasse.
Er meint es in etwa so:
Versuch.cs



Public Class Versuch
{
   private string Textboxstring;

   public void set_TB_String(string TB_string)
   {
      Textboxstring=TB_string;
   }
   
   public string get_TB_string()
   {
   return Textboxstring;
   }

//Alles was du sonst noch so in Versuch.cs stehen hast.....

WriteLog(get_TB_string());

}


In deinem Formular musst du dann set_TB_string aufrufen und dabei den Text innerhalb der TextBox direkt in die Textboxstring Variable schreiben.
Beispiel:
Form1.cs


public partial class Form1 : Form
{
   Versuch Versuch_cs_instanz= new Versuch();

   private void TextBox2_TextChanged(object sender, EventArgs e)
   {
      Versuch_cs_instanz.set_TB_string(TextBox2.Text);
   }
}

1.040 Beiträge seit 2007
vor 8 Jahren

Du sollst keine Methode übergeben, sondern einen Parameter an eine Methode. 😉
Evtl. kommst du weiter, wenn du nochmal eine Schritt zurückspringst und dir Grundanlagen anließt und festigst?
[FAQ] Wie finde ich den Einstieg in C#?

T
tm64 Themenstarter:in
23 Beiträge seit 2015
vor 8 Jahren

Danke Toxo für das klasse bsp.
jetzt wird mir klar wie mann es richtig macht

vorallem das du da set und get schreibst dadurch verstehe ich es gut , danke nochmals für deine mühe

3.003 Beiträge seit 2006
vor 8 Jahren

Die korrekte Notation in C# wäre:



public Class Versuch
{
      public string TextBoxInhalt { get; set;}

      //Alles was du sonst noch so in Versuch.cs stehen hast.....

      WriteLog(TextBoxInhalt);
}

public partial class Form1 : Form
{
   Versuch meinVersuch = new Versuch();

   private void TextBox2_TextChanged(object sender, EventArgs e)
   {
        meinVersuch.TextBoxInhalt = ((TextBox)sender).Text;
        //ODER meinetwegen:
        meinVersuch.TextBoxInhalt = TextBox2.Text;
   }
}

LaTino

Wir sind schließlich nicht in Java, verdammt nochma....

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

T
tm64 Themenstarter:in
23 Beiträge seit 2015
vor 8 Jahren

LaTino auch dir nochmals danke für deinen wirklich schönen code
den werd ich versuchen jetzt auch immer so zu übernehmen ich auf meine alten tage kann den dann hier immer nochmals ansehen , vergesse leider oft schnell mal was
da merkt man du hast viel arnung bei dir sitzt meist jede klammer wie im lehrbuch 😉

ich hoffe ihr gestattet mir noch eine weitere kleine frage , der übersicht halber dann vll in einen neuer thread