Combobox-Index an variable übergeben

Nemesis

Nemesis

N3RD
hi,
ich weiss nicht, ob hier auch C# reingehört, wenn nicht, bitte einfach verschieben.

Aufgabenstellung:
Eine GUI, die Lotto-Reihen erstellt.
Man soll auswählen können wieviel Reihen man erstellt haben möchte.

Momentaner stand:
ich habe ein neues Projekt gestartet, welches die 3 files:
  • Assamblyinfo.cs
  • Main.cs
  • MainWindow.cs enthält
dann habe ich in MainWindow.cs im designer ein MainWindow erstellt mit einer Combobox, einem Button und einem Text View.

Main.cs:
Code:
using System;
using Gtk;

	class MainClass
	{
		public static void Main (string[] args)
		{
			Application.Init ();
			MainWindow win = new MainWindow ();
			win.Show ();
			Application.Run ();
		}
	}

	class lotto
	{
		public static void lottozahlen ()
		{
			int i, j, l, x;
			x = Convert.ToInt16(???);	// Combobox-Inhalt an variable x übergeben
			
			
			int[] lotto = new int[6];
			bool neueZahl;
			
			System.Random RandNum = new System.Random();
			
			for (l=0; l<x; l++)		// erstellt anzahl der gewünschten reihen
			{
				for (i=0; i<6; i++)		//zieht nacheinander 6 zufallszahlen
				{
					do		//wiederholt ziehungen so lange bis zahlen unterschiedlich sind
					{
						lotto[i] = RandNum.Next(49);	// zahl zwischen 1 und 49 erstellen
						neueZahl = false;
						for (j=0; j<i; j++)		//alle bislang gezogenen zahlen durchlaufen
						{
							if (lotto[j] == lotto[i])		// doppelte zahlen erkennen
							{
								neueZahl = true;
							}
						}
					}
					while (neueZahl);
				}
				Array.Sort(lotto);		//zahlen im Array der grösse nach sortieren
	
										// zahlen in feld ausgeben
			}
		
		}
		
	}

MainWindow.cs:
Code:
using System;
using Gtk;

public class MainWindow: Gtk.Window
{
	protected Gtk.ComboBox combobox;
	protected Gtk.TextView textview;
	protected Gtk.Button button;

	
	public MainWindow (): base ("")
	{
		Stetic.Gui.Build (this, typeof(MainWindow));
	}
	
	protected void OnDeleteEvent (object sender, DeleteEventArgs a)
	{
		Application.Quit ();
		a.RetVal = true;
	}
}

aber wie kann ich jetzt in der Main.cs die auswahl der combobox abgreifen, um dann die gewünschte anzahl von reihen in dem Text View auszugeben?

Monodoc ist da recht spährlich, eigentlich nicht zu gebrauchen. und in google finde ich da auch nichts wirklich brauchbares.

ich sag schonmal danke
 
main.cs:
Code:
using System;
using Gtk;


	class MainClass
	{
		public static void Main (string[] args)
		{
			Application.Init ();
			MainWindow win = new MainWindow ();
			win.Show ();
			Application.Run ();
		}
	}

MainWindow.cs:
Code:
using System;
using Gtk;

public class MainWindow: Gtk.Window
{
	protected Gtk.TextView textview;
	protected Gtk.Button button;
	protected Gtk.ComboBox combobox;
	
	public MainWindow (): base ("")
	{
		Stetic.Gui.Build (this, typeof(MainWindow));
	}
	
	protected void OnDeleteEvent (object sender, DeleteEventArgs a)
	{
		Application.Quit ();
		a.RetVal = true;
	}

	protected virtual void lotto(object sender, System.EventArgs e)
	{
		int i, j, l, x;
		x = Convert.ToInt16 (combobox.ActiveText);
		
		int[] lotto = new int[6];
		bool neueZahl;
		
		System.Random RandNum = new System.Random ();
		for (l=0; l<x; l++)		// erstellt anzahl der gewünschten reihen
		{
			for (i=0; i<6; i++)		//zieht nacheinander 6 zufallszahlen
			{
				do		//wiederholt ziehungen so lange bis zahlen unterschiedlich sind
				{
					lotto[i] = RandNum.Next(49);	// zahl zwischen 1 und 49 erstellen
					neueZahl = false;
					for (j=0; j<i; j++)		//alle bislang gezogenen zahlen durchlaufen
					{
						if (lotto[j] == lotto[i])		// doppelte zahlen erkennen
						{
							neueZahl = true;
						}
					}
				}
				while (neueZahl);
			}
			Array.Sort(lotto);		//zahlen im Array der grösse nach sortieren
			// zahlen in feld ausgeben
			textview.Buffer.Clear ();
			for (i=0; i<6; i++)
			{
				textview.Buffer.InsertAtCursor (" "+ lotto[i]);
			}
			textview.Buffer.InsertAtCursor ("\n");
		}
	}
}

Die Methode lotto ist dabei mit dem Clicked-Signal von dem button verknüpft.
Funktioniert sogar :)
 
hm, ok, jetzt funktionierts :)
aber, was muss ich da wie und warum machen, dass es so funktioniert?
warum erstellt monodevelop die beiden dateien nicht gleich so, dass es passt?
oder habe ich den code nur in die falsche datei geschrieben?

edit:

hm, ne bei mir tuts doch net, aber fehler gibt er auch keinen aus.

"textview.Buffer.InsertAtCursor" gibt die Zahlen im feld "textview" dort aus, wo der cursor steht?
kann es daran liegen, dass ich dem button in mono noch beim event clicked etwas zuweisen muss?
 
Zuletzt bearbeitet:
Nemesis schrieb:
hm, ok, jetzt funktionierts :)
aber, was muss ich da wie und warum machen, dass es so funktioniert?
warum erstellt monodevelop die beiden dateien nicht gleich so, dass es passt?
oder habe ich den code nur in die falsche datei geschrieben?
Man kann es bestimmt auch anders machen, aber so halte ich es für die bessere Art und Weise.


Nemesis schrieb:
hm, ne bei mir tuts doch net, aber fehler gibt er auch keinen aus.

"textview.Buffer.InsertAtCursor" gibt die Zahlen im feld "textview" dort aus, wo der cursor steht?
Ja, und da das Textfeld vorher mit "textview.Buffer.Clear ()" gelöscht wird, ist das Immer am Anfang.
Nemesis schrieb:
kann es daran liegen, dass ich dem button in mono noch beim event clicked etwas zuweisen muss?
Ja, musst du, genau wie ich geschrieben hab:
Mµ*e^13.5_?¿ schrieb:
Die Methode lotto ist dabei mit dem Clicked-Signal von dem button verknüpft.
 
dann sagt das aus, dass wenn der button geclickt wird, diese methode ausgeführt werden soll?
Code:
protected virtual void lotto([B]object sender, System.EventArgs e[/B])

aber was muss ich da jetzt dem button noch mitgeben?


thx
 
achso "nur" lotto, ich hatte lotto()
jetzt tuts :)
aber wenn man "textview.Buffer.Clear ();" nach jeder ziehung von 6 zahlen ausführt, löscht er die vorherigen 6 und zeigt somit immer nur eine reihe an ;)
also habe ich es nach der initialisierung von rand gepackt, dann löscht er das textfeld nur zu beginn einmal :)

so, weiter gehts ;) ...
 
Nemesis schrieb:
aber wenn man "textview.Buffer.Clear ();" nach jeder ziehung von 6 zahlen ausführt, löscht er die vorherigen 6 und zeigt somit immer nur eine reihe an ;)
also habe ich es nach der initialisierung von rand gepackt, dann löscht er das textfeld nur zu beginn einmal :)
Ups, ja, ist klar. Mein Fehler.
War schon etwas spät :O
 
macht nix, ich sollte ja auch noch was denken ;)

edit:

hm, wie ist das wenn ich ne gui aus glade einbinden möchte?
wenn ich ein glade projekt aufmache, dann habe ich nr die main.cs, keine MainWindow.cs, und in der habe ich jetzt stehen:

Code:
using System;
using Gtk;
using Glade;

public class GladeApp
{
	public static void Main (string[] args)
	{
		new GladeApp (args);
	}

	public GladeApp (string[] args) 
	{
		Application.Init ();

		Glade.XML gxml = new Glade.XML ("gui.glade", "window1",  null);
		gxml.Autoconnect (this);
		Application.Run ();
	}

	// Connect the Signals defined in Glade
	private void on_window1_delete_event (object sender, DeleteEventArgs a) 
	{
		Application.Quit ();
		a.RetVal = true;
	}
	
	protected virtual void ziehung(object sender, System.EventArgs e)
	{
		int i, j, l, x;
		x = Convert.ToInt16 (combobox.ActiveText);
		
		int[] lotto = new int[6];
		bool neueZahl;
		
		System.Random RandNum = new System.Random ();
		textview.Buffer.Clear ();
		for (l=0; l<x; l++)		// erstellt anzahl der gewünschten reihen
		{
			for (i=0; i<6; i++)		//zieht nacheinander 6 zufallszahlen
			{
				do		//wiederholt ziehungen so lange bis zahlen unterschiedlich sind
				{
					lotto[i] = RandNum.Next(49)+1;	// zahl zwischen 1 und 49 erstellen
					neueZahl = false;
					for (j=0; j<i; j++)		//alle bislang gezogenen zahlen durchlaufen
					{
						if (lotto[j] == lotto[i])		// doppelte zahlen erkennen
						{
							neueZahl = true;
						}
					}
				}
				while (neueZahl);
			}
			Array.Sort(lotto);		//zahlen im Array der grösse nach sortieren
									
			//textview.Buffer.Clear ();
			for (i=0; i<6; i++)
			{
				textview.Buffer.InsertAtCursor (" "+ lotto[i] +"\n");
			}
			textview.Buffer.InsertAtCursor ("\n");
		}
	}
}

im glade projekt habe ich den button, die combobox und das textview angelegt, und diesen auch im feld "Name" den namen gegeben, des weiteren habe ich beim button unter "signale" ein signal "clicked" angelegt und unter "objekt" habe ich "ziehung" eingeragen. die .gui datei habe ich in das bin/Debug/ verzeichnis meines mono-projektes gepackt.
wenn ich das programm jetzt starte, dann bringt er aber folgenen fehler:
Code:
Unhandled Exception: Glade.HandlerNotFoundException: No handler on_button_clicked found for signal clicked
in <0x002fb> SignalConnector:ConnectFunc (intptr,intptr,intptr,intptr,intptr,int,intptr)
in <0x0004b> (wrapper native-to-managed) SignalConnector:ConnectFunc (intptr,intptr,intptr,intptr,intptr,int,intptr)
in (unmanaged) 0xb6928cbb
in <0x00004> (wrapper managed-to-native) SignalConnector:glade_xml_signal_autoconnect_full (intptr,Glade.XML/SignalConnector/RawXMLConnectFunc,intptr)
in <0x00056> SignalConnector:Autoconnect ()
in <0x00040> Glade.XML:Autoconnect (object)
in <0x0003a> GladeApp:.ctor (string[])
in <0x00019> GladeApp:Main (string[])

was habe ich da noch falsch gemacht?

edit:

und schon wieder ein schritt weiter, wenn ich es nun starte in der console, dann sagt er:
Code:
nemesis@nemesis-mobil:~/Projects/lotto_glade/bin/Debug$ ./lotto_glade.exe

(./lotto_glade.exe:6032): libglade-CRITICAL **: glade_xml_build_interface: assertion `wid != NULL' failed

wenn ich es in mono laufen lasse, dann sagt er:
The name combobox does not exist in the context of 'GladeApp'
The name textview does not exist in the context of 'GladeApp'

naja, 'combobox' heisst die combobox in der die anzahl reihen ausgewhlt werden und 'textview' heisst das feld in dem das ergebnis ausgegeben wird.
beides in der gui.glade vorhanden.

ma noch der code der app, wie sie momentan ist:
Code:
using System;
using Gtk;
using Glade;

class GladeApp
{
	public static void Main(string[] args)
	{
		new GladeApp (args);
	}

	public GladeApp (string[] args) 
	{
		Application.Init ();

		Glade.XML gxml = new Glade.XML ("gui.glade", "MainWindow",  null);
		gxml.Autoconnect (this);
		Application.Run ();
	}

	// Connect the Signals defined in Glade
	private void on_MainWindow_delete_event (object sender, DeleteEventArgs a) 
	{
		Application.Quit ();
		a.RetVal = true;
	}
	
	protected virtual void ziehung(object sender, System.EventArgs e)
	{
		int i, j, l, x;
		x = Convert.ToInt16 (combobox.ActiveText);
		
		int[] lotto = new int[6];
		bool neueZahl;
		
		System.Random RandNum = new System.Random ();
		textview.Buffer.Clear ();
		for (l=0; l<x; l++)		// erstellt anzahl der gewünschten reihen
		{
			for (i=0; i<6; i++)		//zieht nacheinander 6 zufallszahlen
			{
				do		//wiederholt ziehungen so lange bis zahlen unterschiedlich sind
				{
					lotto[i] = RandNum.Next(49)+1;	// zahl zwischen 1 und 49 erstellen
					neueZahl = false;
					for (j=0; j<i; j++)		//alle bislang gezogenen zahlen durchlaufen
					{
						if (lotto[j] == lotto[i])		// doppelte zahlen erkennen
						{
							neueZahl = true;
						}
					}
				}
				while (neueZahl);
			}
			Array.Sort(lotto);		//zahlen im Array der grösse nach sortieren
									
			for (i=0; i<6; i++)
			{
				textview.Buffer.InsertAtCursor (" "+ lotto[i] +"\n");
			}
			textview.Buffer.InsertAtCursor ("\n");
		}
	}
}
thx
 
Zuletzt bearbeitet:
Tut mir verdammt leid, dass ich erst so spät antworte, ich hab die pn übersehen.

Du musst die entsprechenden Widgets innerhalb von der Klasse GladeApp deklarieren.
Du musst also innerhalb von GladeApp folgende Zeilen einfügen:
Code:
[Widget] Gtk.TextView textview;
[Widget] Gtk.ComboBox combobox;
 

Ähnliche Themen

Rollei Mini Wifi Camcorder

Samba 4 Gast Zugang unter Ubuntu funktioniert nicht

Displayport + externer Monitor zeigt bei startx nichts erst bei DVI

Ubuntu X / dbus problem

Problem bei Berechnung

Zurück
Oben