Das Problem ist nur: Wie kann ich z.B. notepad sagen es soll tcp://127.0.0.1:60135 oder so öffnen?
Garnicht. Der will ein Dateisystem.
Wie genau man die Emuliert weiß ich nicht. Aber TrueCrypt macht das ja z.B. auch.
Vielleicht kannst du mal suchen wie man nen USB stick emuliert und dann die Datenstreams irgendwie abfangen und ins Netzwerk umleiten. Aber einfach wird das sicher nicht.
Namen sind Schall und Rauch, das passiert schnell wenn man "mal eben" was zusammen baut. Deine Kommentare machen das dann auch noch besser verständlich, dank 😃
Mich würde Interessieren ob es burkut nun auch geholfen hat.
Schau dir mal die Klasse BackgroundWorker an. Die kann events werfen die dann wieder sync mit der GUI sind.
deshalb hängt in meiner nähe ein schönes poster mit den gängigsten patterns inkl. einem lustigen bild zu jedem pattern.
Gibt es das digital? 😃
Würde mich interessieren.
public interface IMyInterface {
public void SendMessage(string msg);
}
public class MySender : IMyInterface {
private IMyInterface theOther;
public MySender(IMyInterface theOther) {
this.theOther = theOther;
}
public void SendMessage(string msg) {
// Do Something with the message
}
}
public class MyReceiver : IMyInterface {
private IMyInterface theOther;
public MyReceiver (IMyInterface theOther) {
this.theOther = theOther;
}
public void SendMessage(string msg); {
// Do Something with the message
}
private string AnywhereInThisClass() {
theOther.SendMessage("Hey this is a Message for you!");
}
}
Irgendwas in die Richtung?
Man kann eine Verbindung so lange öffnen wie es noch kein anderes Programm getan hat. Das heißt aber nicht das ein gerät verbunden ist. IsOpen hilft also wie gesagt nicht.
Du muss Daten an das Gerät schicken und auf eine Antwort warten. Sowas wie Ping wäre da toll. Oder einfach probieren das Gerät zu benutzen und wenn kein ack kommt war die Verbindung wohl nicht da. Andere Möglichkeiten gibt es so weit ich weiß leider wirklich nicht. TCP/IP dürfte das intern auch nicht so viel anders machen und auch da hat man ja tatsächlich immer mal wieder Probleme mit offenen / geschlossenen Verbindungen.
Stichwort: NFS Network File System
Ist allerdings nen recht großes Thema und ich kenne auch nur ein paar grundsachen. Es gibt einige Dinge die man brachten muss. Selber Programmieren würde ich das nicht wenn nicht unbedingt notwendig.
Ansonsten ist nen Networkstream auch nen Stream wie nen Filestream. Mit unterschieden wie: Der Network stream ist nicht so zuverlässig.
Vielleicht kannst du deinen Anwendungsfall auch noch etwas genauer beschreiben, das könnte auch helfen.
Gruß, Tarion
google is your friend: http://www.codeproject.com/KB/tree/treeviewadv.aspx
Nimm einen Tree view und einen Datagrid uns setzte sie nebeneinander (z.B. in einem SplitControl) nun kannst du auf die select events vom treeView hören und den DataGrid entsprechend einstellen.
"this" steht für einen DataGridView
this.CellFormatting += new DataGridViewCellFormattingEventHandler(AlternativeSelectionGridView_CellFormatting);
// [...]
void AlternativeSelectionGridView_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
if (this.Columns[e.ColumnIndex].Name == "MyCol")
{
int intVal;
if (int.TryParse(e.Value, out intVal))
{
e.Value = String.Format("{0:0#####}", intVal); // Some formatting here
e.FormattingApplied = true;
}
}
}
Den double[][] wrapper brauch ich also eh. D.h. ich werde da in jedem fall meine Objekte lassen. Diese Objekte kann ich als string speichern. Eine Matrix eine Zeile. Nach dem Auslesen einer Matrix muss dann immer noch der Wrapper geladen werden.
Der Wrapper kann auch stark mit dem Programm verwoben sein, aber es gibt eindeutige Zeitpunkte wann die Matrix serialisiert werden muss. Also Wrapper -> string -> DB Zeile
@Matrixrechnungen:
Die Algorythmen sind schon implementiert. Bei uns reicht von Mises Iteration zur EW Bestimmung.
Ich habe eine Tabelle mit Kriterien, jedes Kriterium kann ein Vaterkriterium haben. Es ist also eine Baumstruktur.
Ich frage mich ob man das Updaten des Baumes nach Änderungen in der DataTable noch besser lösen kann.
Auch alle anderen Kommentare und Kritik zum Code sind erwünscht.
Der Code:
MyDataSet.CriterionRow
int CriterionID
string Name
int ParentID
treeView ist ein einfacher Tree view.
criterionBindingSource hat die DataTable als binding source.
public MyForm()
{
InitializeComponent();
criterionBindingSource.DataSource = DataModel.Instance.MyDataSet.Criterion;
criterionBindingSource.CurrencyManager.ItemChanged += new ItemChangedEventHandler(CurrencyManager_ItemChanged);
treeView.AfterLabelEdit += new NodeLabelEditEventHandler(treeView_AfterLabelEdit);
treeView.BeforeExpand += new TreeViewCancelEventHandler(treeView_BeforeExpand);
treeView.LabelEdit = true;
InitTree();
}
/// <summary>
/// Initialize the treeView
/// </summary>
private void InitTree()
{
/* Edit: Das erste query war natürlich unnötig */
var rootNode = (from crit in DataModel.Instance.MyDataSet.Criterion
where crit.ParentID == 0
select crit).First();
TreeNode tree = null;
if (rootNode != null)
{
tree = new TreeNode(rootNode.Name);
tree.Tag = rootNode;
AddChilds(tree);
}
if (tree != null && tree.Nodes.Count > 0)
{
treeView.Nodes.Add(tree);
}
}
/// <summary>
/// BeforeExpand, load data to display
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void treeView_BeforeExpand(object sender, TreeViewCancelEventArgs e)
{
e.Node.Nodes.Clear();
AddChilds(e.Node);
}
/// <summary>
/// Add childs from the DataTable to a node
/// </summary>
/// <param name="parent">The parent node that should get it's childs</param>
private void AddChilds(TreeNode parent)
{
var row = (MyDataSet.CriterionRow)parent.Tag;
var rows = from crit in DataModel.Instance.MyDataSet.Criterion
where crit.ParentID == row.CriterionID
select crit;
foreach (MyDataSet.CriterionRow n in rows)
{
TreeNode newNode = new TreeNode(n.Name);
newNode.Tag = n;
parent.Nodes.Add(newNode);
// Jede neue node bekommt eine Fake node
AddFakeNode(newNode);
}
}
/// <summary>
/// Add a fake node to display the little + to allow expanding
/// </summary>
/// <param name="parent">The parent node that should get the fake child</param>
private void AddFakeNode(TreeNode parent)
{
var row = (MyDataSet.CriterionRow)parent.Tag;
var childs = from crit in DataModel.Instance.MyDataSet.Criterion
where crit.ParentID == row.CriterionID
select crit;
if (childs.Count() > 0)
{
parent.Nodes.Add("Fake"); // Never displayed
}
}
/// <summary>
/// Occures if a node changed
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void CurrencyManager_ItemChanged(object sender, ItemChangedEventArgs e)
{
DataRowView view = (DataRowView)criterionBindingSource.CurrencyManager.List[e.Index];
MyDataSet.CriterionRow row = (MyDataSet.CriterionRow)view.Row;
UpdateNode(row, treeView.Nodes[0]);
}
/// <summary>
/// Find and update a node that has changed
/// </summary>
/// <param name="row"></param>
/// <param name="node"></param>
private void UpdateNode(MyDataSet.CriterionRow row, TreeNode node)
{
foreach (TreeNode n in node.Nodes)
{
if (n.Tag == row)
{
// Update
n.Text = row.Name;
return;
}
UpdateNode(row, n);
}
}
/// <summary>
/// Update the DataTable after edit a Label
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void treeView_AfterLabelEdit(object sender, NodeLabelEditEventArgs e)
{
MyDataSet.CriterionRow row = (MyDataSet.CriterionRow)e.Node.Tag;
row.Name = e.Label;
row.AcceptChanges();
}
}
Edit: Fehler behoben.
Ich habe dynamisch viele Matritzen mit unterschiedlichen größen.
Ich kann also nicht für jede Matrix eine Spalte einrichten. Ich denke fast es wäre das beste die Matrix zum speichern in einen String (oder Blob) zu konvertieren, ich muss eh immer eine ganze Matrix laden und nie teile einer Matrix und ich spare mir viele viele Zeilen die alle noch einen Primary key haben.
Edit:
Und ist es sinnvoller meine Matrixoperationen in die DataSets zu packen oder lieber eigene Klassen zu nehmen die von einem DataSet geladen werden. Meine Matrix klassen haben > 500 Zeilen.
Hi,
ich beschäftige mich gerade wieder etwas mit Datenzugriffen. Ich habe eine recht komplexe Applikation geschrieben bei der viele Daten in Matrizen gespeichert sind. Alle Daten werden mir dem Programm generiert und berechnet.
Mein größter Schwachpunkt ist, dass ich die Daten in meinen Datenklassen direkt binär spiechere. Die Klassen sind [Serializable]. Das funktioniert relativ gut. Jedoch ist die Datenrepresäntation stark mit dem Programm verwoben ich hätte da gerne eine sauberere Schnittstelle um die Daten später eventuell auch mal in einer Datenbank speichern zu können.
Vielleicht ist der Aufwand groß, aber auch für zukünftige Projekte will ich von den Überlegungen lernen.
Einige Lösungsansätze und Gedanken:
So hab ich es:
Daten werden in Matrizen gespeichert, die Matrizen implementieren Operationen wie Eigenwertberechnung, Multiplikation, etc..
Die Matrizen werden an vielen Stellen im Programm benutzt und ab und an kopiert.
Sauberere Schnittstelle
Ich könnte mir eine Trennung der Datenberechnung und Datenhaltung vorstellen. Dann hätte ich immer noch meine Matrixklassen die nun nur noch zum Rechnen sind aber ihre Daten aus einer anderen Datenquelle beziehen können.
Matrix m = new Matrix(MyDataElement);
Jetzt kann man mit den Matritzen hübsch rum rechnen und am Ende die relevanten Informationen wieder in die Datenobjekte schieben.
Wenn man das Projekt speichert müssten die Daten dann aus den Matritzen wieder irgendwie in die Datenquelle gelangen.
Grade die Struktur der Matrizen bereitet mir mit DataSets Probleme. Aber DataSets scheinen ja irgendwie der Standartweg zu sein Daten in c# zu verwalten.
Mich würden mal einige Lösungsansätze interessieren die euch bei dem Problem einfallen.
Grüße, Tarion
Ein singleton Präsenter den die Views nutzten ist aber schneller implementiert.
Und die Entkopplung, also austausch des Funktionsaufrufes durch werfen eines Events von seiten der View ist später recht schnell gemacht falls nötig.
Ebenfalls lasse ich die Interfaces für meine Views weg. Es ist deutlich mehr aufwand immer noch Interfaces im Code mit zu pflegen. Der Aufwand Interfaces vor die Views zu setzten entsteht erst wenn man wirklich testen will. Und dann ist das Refacotring ebenfalls nicht wesentlich aufwändiger als während der Entwicklung.
Also da weiche ich lieber von einem Pattern ab als mir unnötige Arbeit zu machen.
Ich finde die Frage ganz interessant.
Ich für meinen Teil komme bei einem mittlerweile recht großem Projekt mit nur einem Präsenter aus.
Mein Präsenter verwaltet ja ohnehin die Views und Models und wenn das Loggen mehr logig braucht als das anzeigen einer neuen form die ggf nen Datenobjekt mit den Logs mit bekommt, dann würde ich das Model erweitern um den Präsenter "auf zu räumen".
Beispiel:
Präsenter enthällt: FormAdd, FormLog, Logger, ValueObj
Das ValueObj enthällt in irgend einer form die Zahlen die zu addieren sind.
Die FormLog hätte ne refferenz zum Logger oder einem teil des Loggers um diesen zu visualisieren (mittels DataBindings)
Wenn in FormAdd jetzt 2 Zahlen addiert werden wird im Präsenter eine Funktion aufgerufen die mitteilt das es einen neuen Logeintrag gab. Vom z.B. vom Logger selbst. Nun kann der Präsenter entschieden ob er die FormLog anzeigen soll. Die FormLog an sich ist ja per DataBinding an die Logs gebunden und kann diese immer Darstellen.
Für WinForms halte ich das MVP für das beste.
Interessant. Die frage ist ob man dafür zu viel unnötig coden muss. Die Factory kann entscheiden ob sie einzelne models als Singletons behandelt oder immern eue zurück liefert?
Naja im prinzip ist es nurnoch ein Supervising Controller, da die Forms ja durchaus mit den Daten interagieren.
Was mir aber sonst fehlt ist ein Konzept wie ich die ganzen Daten Models "bündel" und in den Views zugänglich mache, sowie eine möglichst Lose Kommunikation unter den verschiedenen Modulen des Models herstelle.
Hi,
es ist wohl zum großen teil eine Phillosophische Frage, aber viele Dinge kann man auch gut argumentieren. Es geht um den Aufbau eines C# GUI Programms.
Da gibt es große Schlagworte wie MVC, aber dafür gibt es ja schon 101 umsetzungen. Die Teilweise besser für Webanwendungen als für WinForms geeignet sind etc.
Außerdem suche ich dort eine Lösung eine "God Class" (aka Blob) zu umgehen.
Ich würde hier gerne versuchen mehrere Ansätze zu sammeln und daraus eine möglichst beste Lösung ziehen.
Nun mal ein bisschen was zu meinem Stiel, auch dazu nehme ich gerne Kritik entgegen. Es hat sich nach vielen Versuchen das MVC bestmöglich umzusetzen so ergeben. Aber ganz zufrieden bin ich immer noch nicht.
Ich habe eine Controller Klasse die ich vom ApplicationContext ableite und als Singleton Realisiere. Diese Klasse verwaltet nun die wesentlichen Programmfunktionen. Implementiert aber keine Funktionalität sondern "Managed" nur die Verbindung zwischen den einzelnen Modulen und hällt refferenzen zu den Stuerobjekten der einzelnen Programmteile. Ist damit also die Verbindung zwischen Model und View. Zusätzlich darf die View aber über Databindings auch direkt auf die View zugreifen.
Ein typisches Beispiel für eine Controllerfunktion:
public void CriterionVoting()
{
using (FormMultivote form = new FormMultivote(this.AhpTree.NonLeafs))
{
form.ShowDialog();
formProgram42.Refresh();
}
}
Ein etwas komplizierteres Beispiel mit etwas mehr Logik:
public void CompareCriteria()
{
AhpNode parentNode = AhpTree.SelectedNode;
AhpCompareMatrix matrix = parentNode.GetCompareMatrix(Users.GuiUser);
if (!(matrix is AhpCriteriaCompareMatrix))
{
MessageBox.Show("Dieses Kriterium hat keine unterkriterien die bewertet werden müssen");
return;
}
using (FormCriterionVoting voting = new FormCriterionVoting(matrix))
{
// Lass den User die Matrix ausfüllen
voting.ShowDialog();
formProgram42.Refresh();
}
}
Viel mehr Logik würde ich im Controller aber verhindern. Wieviel es sein darf ist wohl Ansichtssache.
Was ich nur befürchte ist, dass der Controller irgend wann über alle Maße wächst. Aber mir fällt gleichzeitig keine bessere Möglichkeit ein die Daten untereinander und mit der GUI zu koppeln. Hat da jemand Ansätze für eine Losere Kopplung?
Naja, helfen tut es nicht wirklich...
Also wenn ich z.B. Excel öffne und dort eine Datei speichern möchte steht z.B. Mappe1.xls als Dateiname unten drin.
Ändere ich den Filter auf csv, steht dort Mappe1.csv.Wie kann ich dieses Verhalten erzeugen?
Gibt es da eine anderen Dialog?
Bei mir bleibt immer die Dateiendung so stehen, wie sie ist.
Das ist kein Standardverhalten bei Excel. Probiers mal mit paint. Wieso muss denn im Speichern Dialog die Endung hinter dem Dateinamen stehen und sich ändern. Kann da nicht einfach keine Endung stehen und die richtige angehängt werden?
Die richtige Anhängen könntest du sogar noch machen nachdem der Dialog die eine Antwort gegeben hat.
Sehe grade das es sogar eine Einstellung dafür gibt:
fdlg.AddExtension = true;
Edit: Hm die hast du ja sogar an, wenn das nicht reicht hilft wohl wirklich nur ein neuer FileDialog.
public Form2(Configuration config)
{
InitializeComponent();
BackColor = config._BackColor;
Text = config._Title;
label1.Text = config._nummer.ToString();
_config = config;
}
Wie ist die Variable _config in der form 2 deklariert.
Klingt fast so als wäre die static.
Durch Form2 frm = new Form2(cfg) erhällst du eine komplett neue Instanz die nur über statische Variablen direkt mit einander kommunizieren können oder indirekt über andere Objekte.
Main form = new Main(vars);
dort übergibst du eine Referenz auf das object vars.
Wenn vars ein struct wäre, würde es eine Kopie erzeugen. Das wäre eine Möglichkeit.
Ansonsten implementiere deiner Classe das IClonable interface und rufe es so auf:
Main form = new Main(vars.Clone());
Wieso nicht:
fdlg.DefaultExt = ".dxf";
Dann werden nur dxf Dateien angezeigt, aber man will ja auch eine dxf Datei speichern.
Ansonsten wird meiner Meinung nach die Endung von
fdlg.FileName = Viewer.Model.Filename;
jedem Filter vor gezogen.
Also wenn der Filter auf *.abc steht und ich "myfile.xyz" speicher (die " sind evtl nötig) entsteht die Datei myfile.xyz wenn ich nur myfile speicher entsteht die Datei gemäß dem Filter also myfile.abc.
So mach ich es immer mit paint wenn ich die endung jpg und nicht JPG möchte 😉 Und der Dialog ist ja der selber aus der Windows API. Hab das jetzt nicht nachprogrammiert. Hoffe es hilft.
Meinst du so was wie im
> ?
Da ist der SourceCode dabei, aber reines Copy'n'Paste kannst du auch hier nicht machen.mfg
SeeQuark
Sieht ganz gut aus. Reines Copy & Paste muss es ja auch gar nicht sein 😃
Bei CodeProject habe ich nur das gefunden: http://www.codeproject.com/KB/system/RadialContextMenu.aspx
Genau was ich suche, nur für c# und nicht in c++ 😕
Moin,
ich will ein Context menu für meine Applikation. Um die Nutzung zu vereinfachen will ich das gerne so gestallten, dass beim MouseDown das MEnu öffnet und die Maus an das möglichst ringförmige Contextmenu gebunden wird und beim loslassen der Maus der gerade aktive Eintrag gewählt wird.
So das man mit der Maus während man gedürckt hält nicht aus dem Menu raus kann.
Bevor ich sowas selber baue, wollte ich fragen ob jemand weiß ob es das schon irgendwo gibt.
Wenn nicht, könnte ich sicher die Maus an ein normales Menu binden, aber wie ich ein rundes Menu erstelle entzieht sich dann schon wieder meiner Vorstellung, außer vll irgnedwleche Bilder mit mouse over events zusammen zu kleben.
Ja, nutzen will und werde ich die auch. Vll noch die TcpClient Klasse. Aber es läuft auf einen Stream von Binärdaten hinaus, den ich parsen muss.
Dafür will ich einen generischen wrapper der sich um mejine Verbindungen kümmert und den stream parst.
Der Dateidialog kann nur nach Dateinamen filtern, da er keine Leseoperationen auf den Daten ausführt.
Außerdem läßt sich wenn man ins dateinamefeld ein * eingibt und enter drückt der Filter immer deaktivieren 😉 Ganz praktisch eigentlich.
Somit wäre das beste wohl, wenn verschiedene Dateiversionen in verschiedenen Verzeichnissen landen oder nach dem Laden die Kompatibilität überprüft wird und evtl Konvertiert werden kann.
Ein kurzer Beispielcode könnte helfen das Problem nach zu vollziehen.
[Hinweis] Wie poste ich richtig? Hi,
ich bin dabei eine Anwendung zu schrieben, welche über TCP kommunizieren soll. Da gibt es für c# ja viele Ansätze.
Remoting hat das Große Problem, dass es nicht bidirektional ist. Also der Server kann nicht ohne weiteres "spontan" Nachrichten an den Client zurück senden. Es gibt eine kommerzielle Library die es wohl kann, aber das kommt für mich nicht in Frage.
Ich habe auch schon einige kleine Ansätze gefunden eine Paketbasierte Kommunikation über die socket klassen auf zu bauen, aber richtig ausgereift war keine.
Ich suche eine Library die auf der Ebene von Events und Objekten mit mehren Clients umgehen kann.
Wichtig ist, das der Client eine Verbindung zu einem Server auf baut und diese dann in beide Richtungen genutzt wird. Ansonsten kommt es schnell zu Problemen mit Firewall und man könnte auch 2 Remoting Chanels aufbauen.
Ich habe selbst schon mehrere Stunden im Internet gesucht und gelesen aber bin noch auf nichts tolles gestoßen. Wie realisiert ihr eine Bidirektionalse Netzwerk Kommunikation in c#? [Hinweis] Wie poste ich richtig?
Das geht schon in die richtige Richtung:
http://www.codeproject.com/KB/IP/socketsByBobJanova.aspx
Statt Trennzeichen einfach die Länge der Nachricht vorweg schicken. Dann beim Empfangen erst die Länge der Nachricht lesen und entsprechend viel empfangen. Dann kommt die nächste Längenangabe.
Oder Escape Zeichen verwenden wie es auch der Stringoperator in c# macht. da kann man auch """ machen und das " wird nicht als start oder Endzeichen interpretiert, ist aber aufwändiger zu implementieren.