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 🙂
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.
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
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.
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
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.
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 😦
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.
Microsoft MVP // Me // Blog // GitHub // @Egghead // All my talks // Speakerdeck
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
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)
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.
Microsoft MVP // Me // Blog // GitHub // @Egghead // All my talks // Speakerdeck
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 😃
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);
}
}
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#?
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
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)
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