ich habe ein DatagridView (Quell-DGV), in dem ich Bilder anzeigen lasse. Beispielsweise 8 Spalten und 3 Zeilen je Zelle ein Bild.
Ich möchte ich per Drag & Drop einzelne Bilder in ein anderes Datagridview (Ziel-DGV) verschieben - das funktioniert stabil.
Nun möchte ich aber, dass das ausgewählte Bild, welches ins Ziel-DGV verschoben wurde, aus dem Quell-DGV verschwindet und die nachfolgenden Bilder "nachrücken".
Gibt es eine Möglichkeit eine bestimmte Zelle zu löschen oder auszublenden?
Leider habe ich in meiner Recherche nur Funktionen gefunden, die ganze Zeilen oder Spalten löschen.
Ich habe ein Hauptformular (Form_Main) von welchem ich aus Form2 (Form_GS_Analysis) starte:
Form_GS_Analysis form_GS_Analysis;
private void GSA_Open_Form()
{
//Form wird initialisiert
form_GS_Analysis = new Form_GS_Analysis();
form_GS_Analysis.FormClosed += new FormClosedEventHandler(form_GS_Analysis_FormClosed);
//Form AssistCA wird angezeigt
form_GS_Analysis.Show();
}
private void form_GS_Analysis_FormClosed(object sender, FormClosedEventArgs e)
/*
tritt ein, wenn AssistCA geschlossen wird
*/
{
//Handler wird beendet
form_GS_Analysis.FormClosed -= form_GS_Analysis_FormClosed;
gBx_GSA.Visible = false;
//Marker wird deaktiviert
Is_GSAform_open = false;
}
Im Form2 (Form_GS_Analysis) führe ich nun verschiedenste Berechnung durch und erstelle ein Diagramm. Dieses Diagramm speichere ich als Bild und möchte es per Button im Form2 direkt in Form1 einfügen.
Wie ich das von Form1 aus realisiere, ist mir klar nur nicht wie es direkt von Form2 aus konstruiere. Also wenn der User im Form2 (Form_GS_Analysis) auf den Button drückt.
ich steh grad mal wieder auf dem Schlauch. Ich habe mir ein individuelles MessageForm mit DialogResult gebastelt. Das funktioniert auch alles, wie es soll.
Ich würde aber gern die Benutzung etwas abkürzen:
Momentan:
MyMessageBox_Global myMSG = new MyMessageBox_Global();
DialogResult dialog = myMSG.Get_DiaResult("Test 1 2 3 ", "hier steht die Nachricht", MyMessageBox_Global.msgButton.JaNein_Cancel, MyMessageBox_Global.msgIcon.Fehler, false);
if(dialog == DialogResult.Yes)
{........
Ich würde es gern wie die Standard-MessageBox benutzen. Also so:
MyMessageBox_Global.Get_DiaResult(......)
...ohne jedesmal neu zu Initialisieren.
Wie kann ich die Klasse "einbauen", dass ich sie direkt auffrufen kann. Könnt ihr mir bitte ein Stichwort geben?
ich bräuchte mal eure erfahrene Hilfe. Ich habe ein altes Script, welches in C geschrieben wurde und muss es, da ich die Funktion benötige, in C# integrieren.
Leider fehlt mir aber das Fachwissen - gerade im Punkto Zeiger - das hab ich in C noch nicht richtig kapiert.
ich möchte nach einer getätigten Aufgabe eine Mail über Outlook (Office365) versenden. Das funktioniert auch.
Nur habe ich zwei Optionen:
1. Outlook ist beim Nutzer schon geöffnet und soll nach dem Versenden offen bleiben
oder
2. Outlook vom Nutzer ist geschlossen und soll nach dem Versenden wieder geschlossen werden
ich habe ein Programm (Main_Form) und ein entsprechendes SubForm. In diesem Form lade ich eine dynamische Excel-Tabelle in ein DataGrid, welches ich nach bestimmten Anforderungen im Main_Form filtere.
Nun ist es so, dass es je größer die Tabelle ist, es spürbar länger dauert, bis ich im Main-Form eine Aktion ausführen kann.
Ist es möglich, das ganze SubForm in eine Art Backgroundworker o.ä. auszulagern? Und wenn ja, wie ist das Stichwort dafür? Können dabei Main_Form und SubForm "kommunizieren"?
Ehrlich gesagt übersteigt diese Programmierung momentan meine Kompetenzen.
Was würde die Programmierung eines Parsers kosten, wenn man es in Auftrag geben würde? Entsprechende Vorlagen in C und Pyhton sind vorhanden.
Was ich brauche ist das Bild und die im Bild gespeicherten Informationen (Tags).
ich habe schon seit längerem ein Problem, bei dem ich logisch festhänge:
Wenn ich den CellClick durchführe, dann beziehen sich alle Operationen auf die "neu" selektierte Zeile. Ich benötige aber den Index der Zeile von der ich komme.
Wenn ich eine Variable einsetze, wird diese beim CellClick überschrieben und ich bin wieder bei der neuen Zeile. Gedanklich drehe ich mich im Kreis....
Zum Hintergrund:
Ich führe in der aktuellen Zeile eine Aktion durch, bei der die Zeile entsprechend eingefärbt wird. Wenn ich nun per CellClickEvent die Zeile verlasse, soll die "Alte" eingefärbt sein und bleiben. Aber wenn ich bspw. eine Variable setze, wird im zweiten Durchgang die erste weider gelöscht. Liegt natürlich daran, dass CellClick den Index überschreibt.
Gibt es eine andere Möglichkeit den Index der Zeile von der ich komme abzufangen?
wenn ich aus der Google-Suche komme, lande ich seit der Umstellung immer auf der Forumseite und nicht beim entsprechenden Thema.
BeispielLink: MyCSharp.de - Diskussionsforum
Liegt es womöglich an meiner Browsereinstellung?? ...habe aber nix verändert.
Woher wusste ich nur, dass ich in puncto BinaryFormatter solch ein Statement bekomme
Ich hatte das zwar schon des öfteren gelesen, aber er funktioniert in diesem Punkt gut.
Welche Probleme können denn damit auftreten??
Danke für die kurze Erklärung zum Serialisieren. Ehrlich gesagt habe ich da nach dem Schnellschussprinzip gearbeitet. -> Such bei Google, Kopiere, funzt, keine Gedanken drüber machen.
Ich weiß, dass ist nicht die feine Art und nun bedarf es doch etwas Einarbeitung.
ich möchte ein bestimmte Werte aus einem DatagridView (dgV_ImageList) in einem anderen DatagridView als Backup speichern.
Hier der Code:
DataGridView LoadImages_Info = new DataGridView();
private void Save_Project_Click(object sender, EventArgs e)
{
if (savFD_save_project.ShowDialog() == DialogResult.OK)
{
string SaveFile = savFD_save_project.FileName; //Filename mit Pfad
Save_Listen_Recovery();
Save_Messung_Daten_List(SaveFile, Liste_Recovery_Project);
}
}
private void Save_Listen_Recovery()
{
List<string> FileNames = new List<string>();
foreach (DataGridViewRow row in dGV_ImageList.Rows)
{
FileNames.Add(dGV_ImageList.Rows[row.Index].Cells[5].Value.ToString());
for (int i = 2; i < dGV_ImageList.Columns.Count; i++)
{
LoadImages_Info.Columns.Add(i.ToString(),i.ToString());
LoadImages_Info.Rows.Add(dGV_ImageList.Rows[row.Index].Cells[i].Value);
}
}
Liste_Recovery_Project.Add(new Liste_Recovery()
{
Liste_Messung_Recovery = Liste_Messung_Daten,
FileListe_Recovery = FileNames,
Image_DataGrid = LoadImages_Info
});
}
private void Save_Messung_Daten_List(string FilePath, List<Liste_Recovery> SaveList)
{
FileStream stream;
stream = new FileStream(FilePath, FileMode.Create);
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(stream, SaveList);
stream.Close();
SaveList.Clear();
}
[Serializable]
public class Liste_Recovery
{
public List<Liste_Messung> Liste_Messung_Recovery { get; set; }
public List<string> FileListe_Recovery { get; set; }
public DataGridView Image_DataGrid { get; set; }
}
Ich bekomme aber eine Exeption:
Fehler
System.Runtime.Serialization.SerializationException: "Der Typ "System.Windows.Forms.DataGridView" in Assembly "System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" ist nicht als serialisierbar gekennzeichnet."
Ich habe doch aber das DataGridView als Serializable markiert
Wenn ich das Image_DataGrid auskommentiere funktioniert es tadellos??
2. Blöcke abarbeiten
--> theoretisch denke ich, weiß ich wie es gemeint ist.
Aber es geht los, dass ich ein Problem habe, die Doku zu verstehen. Mir fehlt der Ansatz :(
D.h. was muss ich in C# tun, damit ich ein Block abarbeiten kann und wie komme ich an das Bild.
Das Format hat sich in den letzten 15 Jahren nicht geändert. Da die Tools auch keine Updates erhalten (frei dem Motto never change a running system - sind so schon teuer genug) wird sich an der Situation nichts ändern.
Es gibt schon diverse Importer für dieses Format. Aber entweder mit einer zusätzlichen Programmkomponente (Softwareeigene Sprache) oder in C bzw Python.
Nur nicht in C# und zum "Übersetzen" fehlt mir das Wissen über den Ablauf.
Will es auch nicht nur abschreiben, sondern eben verstehen, was passiert bzw. was passieren muss, damit ich am Ende ein Bild + die dazugehörigen Tags habe.
ich arbeite schon seit längeren an einem Bemaßungsprogramm. Das funktioniert bisher sehr gut für die gängigen Bildformate.
Nun habe ich aber eine Toolgruppe, die Bilder in einem softwareeigenem Format abspeichert (*.dm3).
Ich habe für dieses Dateiformat eine Dokumentation vorliegen, aber mir fehlt der Ansatz/Wissen darüber, wie man dieses Format in ein C#-lesbares Bild umwandelt.
Vermutlich muss die Datei zeilenweise eingelesen und umgewandelt werden, oder? Könnt ihr mir bitte ein Denkanstoß geben oder kurz die Prozedur theoretisch anreissen, damit ich weiß, wonach ich suchen muss bzw. ich mich einarbeiten kann?
public void Save()
{
var serializer = new DataContractSerializer(typeof(XMLgenerator));
using (var stream = new XmlTextWriter(FileName, Encoding.Unicode))
{
serializer.WriteObject(stream, this);
}
}
Der Code für die Deserialisierung sieht wie folgt aus:
public XMLgenerator Load()
{
var deserializer = new DataContractSerializer(typeof(XMLgenerator));
using (var stream = new XmlTextReader(FileName))
{
XMLgenerator config = deserializer.ReadObject(stream) as XMLgenerator;
return config;
}
}
Leider wird aber in der Zeile return config nichts ausgegeben.
Laut Debugger liest er aber alle Daten eine Zeile vorher "XMLgenerator config ...." richtig aus.
Warum werden diese nicht "übergeben"? Was mache ich falsch?
@TH69: ShowDialog() hat bei mir nicht funktioniert, da das Form direkt geschlossen wird. Möglicherweise gibt es da einen Weg, aber da fehlt mir noch etwas Wissen.
Dein Tutorial kannte ich bis dato nicht. Da ich öffter, verschiedenste Unterformulare öffnen muss, werde ich das nachher durcharbeiten. Da gibt es sicher Überarbeitungsbedarf - vielen Dank!
Bis dahin habe ich die für mich gängige Lösung:
Form_Kalibrierungsfenster _Kalibrierungsfenster;
public void Berechnung_Kalibrierung()
{
if (WaitHandler == false)
{
_Kalibrierungsfenster = new Form_Kalibrierungsfenster();
_Kalibrierungsfenster.Show();
_Kalibrierungsfenster.TopMost = true;
_Kalibrierungsfenster.lbl_Bilddaten.Text = Image_Width.ToString() + " x " + Image_Height.ToString() + " Pixel";
}
else if (WaitHandler == true)
{
WaitHandler = false;
_Kalibrierungsfenster.lbl_PixelSize.Text = Math.Round(PixelSize_Kali, 5).ToString() + " " + Kali_Unit_Input + " pro Pixel";
}
}
folgendes:
Ich greife von Form1 auf ein anderes Form (Form_Kalibrierungsfenster) zu. Darin habe ich zwei Textboxen, Comboboxen und zwei Buttons.
Der User soll in den Comboboxen einen Wert und eine Einheit auswählen. Daraus wird ein Pixelwert berechnet, der mit Klick auf den Button, angezeigt werden soll.
Nun habe ich folgendes Problem:
Wenn mein Code, folgend aussieht, dass Form_Kalibrierungsfenster aushalb der Funktion erstellt wird, wird lbl_PixelSize.Text geändert:
Form_Kalibrierungsfenster _Kalibrierungsfenster = new Form_Kalibrierungsfenster();
public void Berechnung_Kalibrierung()
{
if (WaitHandler == false)
{
_Kalibrierungsfenster.lbl_Bilddaten.Text = Image_Width.ToString() + " x " + Image_Height.ToString() + " Pixel";
_Kalibrierungsfenster.Show();
_Kalibrierungsfenster.TopMost = true;
}
else if (WaitHandler == true)
{
WaitHandler = false;
_Kalibrierungsfenster.lbl_PixelSize.Text = Math.Round(PixelSize_Kali, 5).ToString() + " " + Kali_Unit_Input + " pro Pixel";
}
}
Problem dabei, ich kann das geschlossene Form nicht nochmal öffnen.
Wenn ich aber:
Form_Kalibrierungsfenster _Kalibrierungsfenster;
public void Berechnung_Kalibrierung()
{
_Kalibrierungsfenster = new Form_Kalibrierungsfenster();
if (WaitHandler == false)
{
_Kalibrierungsfenster.lbl_Bilddaten.Text = Image_Width.ToString() + " x " + Image_Height.ToString() + " Pixel";
_Kalibrierungsfenster.Show();
_Kalibrierungsfenster.TopMost = true;
}
else if (WaitHandler == true)
{
WaitHandler = false;
_Kalibrierungsfenster.lbl_PixelSize.Text = Math.Round(PixelSize_Kali, 5).ToString() + " " + Kali_Unit_Input + " pro Pixel";
}
}
Wenn ich es aber so schreibe, funktioniert das Form-Handling, wie ich es möchte, aber nach Klick auf meinen Button wird lbl_PixelSize.Text nicht aktualisiert.
Ich habe ein OpenFileDialog mit dem ich verschiedene Bilddateien öffnen möchte.
Nun ist es aber so, dass ich von verschiedenen Tool-Herstellern unterschiedliche Bildformate mit entsprechenden Dateiendungen habe, für die ich einen Import-Filter schreiben muss.
Ich stell mir das ganze so vor:
- Öffne Dateien
- Wenn Datei Endung *.ser hat, dann mach das
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
string[] selectedFiles = openFileDialog1.SafeFileNames;
string[] files = openFileDialog1.FileNames;
Bilder_Anzahl += files.Length;
for (int i = 0; i < files.Length; i++)
{
........
Wie der Filter vor dem Öffnen funktioniert ist mir klar, aber danach?
Gibt es da eine einfache Möglichkeit?
ich habe eine PictureBox mit einem Bild. Dieses soll vermessen werden.
Mit der Maus soll eine Art Fadenkreuz, wie bspw. im CAD, angezeigt werden. Dies kann der Nutzer mit einem Checkbox-Schalter aktivieren und deaktivieren.
Das funktioniert auch, aber das Fadenkreuz bleibt nach Deaktivierung immer noch gezeichnet und ich bekomme es einfach nicht weg :-(