Hallo
schau dir mal die Tools von Syncfusion an, dort gibt es ein Community-Version die gratis ist. Ich weiß aber nicht, in welchem Umfeld (privat oder Firma) du das verwenden willst.
mfG Thomas
Hallo
In der Klasse "DynamicMenuItems" löst Du in der Methode "ToolStripMenuItem_Click" das neue Event aus. Dieses wird dann in Form1 abonniert und dort kannst Du die Methode "DoSomethingInForm1" aufrufen. Eigentlich so wie BlonderHans in seinem Beispiel zeigt mit folgenden Änderungen:
private readonly Form1 _form;
public DynamicMenuItems( Form1 form )
{
_form = form;
//Mache hier irgendwann irgendetwas
}
Das kann gestrichen werden. In DynamicMenuItems folgendes eintragen:
private void ToolStripMenuItem_Click(object sender, EventArgs e)
{
ToolStripMenuItem MenuItem = (ToolStripMenuItem)sender;
CheckMenuItem(MenuItem.Text);
MessageBox.Show("Menu " + sender + " angeklickt");
OnMyEvent(EventArgs.Empty);
}
In Form1 dann das programmieren:
public static void myObject_MyEvent(Object objSender, EventArgs e)
{
MessageBox.Show("myObject_MyEvent (" + objSender + ", " + e + ")");
DoSomethingInForm1();
}
Wenn Du mehrere Aktionen im Event in Form1 ausführen möchtest, dann musst Du halt ein eigenes EventArg definieren und dieses in den beiden Klassen entsprechend übergeben und auswerten.
P.S. Das registrieren des Events in Form1 sollte nicht im ButtonClick sein, sondern in FormLoad. Sonst wird nämlich bei jedem Klick des Buttons das Event nochmals registriert und dadurch das Event x-mal aufgerufen.
Ich hoffe das es jetzt etwas klarer wird und wünsche "Happy Coding"
Thomas
Hallo
Der Fehler liegt eigentlich daran, dass man das so gar nicht macht! Eine Unterklasse sollte nie ihren Parent kennen. Dazu verwendet man Events, siehe https://mycsharp.de/forum/threads/5960/faq-kommunikation-von-2-forms.
mfG
Thomas
Hallo
Meiner Meinung nach geht die Diskussion über NewtonSoft bzw. System.Text.Json am Thema vorbei.
Deine Json sieht doch so aus:
{"id":15,"hardwareComputerSerial":"1A2B3C4"}
d.h. die entsprechende Klasse zum Deseralisieren müsste dann so aussehen:
public class InventoryResponse
{
public int id {get; set;}
public string hardwareComputerSerial {get; set;}
}
Damit sollte es (egal welches Paket Du verwendest) funktionieren. Die Klasse kannst Du auch über Visual Studio erstellen lassen, indem Du den Json-String über "Edit/Paste Special/Paste Json as class" in eine vorhandene Datei einfügst.
mfG Thomas
Hallo
Schau mal auf der Seite von Syncfusion vorbei. Die stellen Ihre Komponenten auch als Community-Version zur Verfügung.
Thomas
Hallo
Ich würde das mit einem StingBuilder und zwei geschaltelten Schleifen machen:
StringBuilder sb = new StringBuilder();
int spalte11;
string spaltezusatz = string.Empty;
string[] zeilen = File.ReadAllLines(Textdatei);
sb.AppendLine(zeilen[0] + ";Zusatzspalte"); //Headerzeile
for (int zeile = 1; zeile < zeilen.Length; zeile++) //alle Zeilen ab 2. Zeile
{
spaltezusatz = string.Empty;
string[] Spalten = zeilen[zeile].Split(';'); // Zeile zerlegen
for (int spalte = 0; spalte < Spalten.Length; spalte++) // alle Spalten durchlaufen
{
if (spalte == 13) // Spalte 13
{
if (Spalten[spalte] == "30") // Wert
{
if (Int32.TryParse(Spalten[11], out spalte11) && spalte11 <= 160) // Wert aus Spalte 11 umwandeln und auf <= 160 prüfen
spaltezusatz = name10[spalte11]; // Wert aus name10 in "Zusatzspalte"
}
else
{
if (Spalten[spalte] == "10")
{
if (Int32.TryParse(Spalten[11], out spalte11) && spalte11 <= 43) // w.o.
spaltezusatz = name30[spalte11];
}
else
{
MessageBox.Show("Fehler");
}
}
}
sb.Append(Spalten[spalte] + ";");
}
if (!string.IsNullOrWhiteSpace(spaltezusatz )) // zusatzspalte gesetzt
sb.AppendLine(spaltezusatz ); // zur Zeile hinzufügen
else
sb.AppenLine("");
}
File.WriteAllLines(Pfad, sb.ToString()); // Zeilen schreiben
LG
Thomas
Hallo
Danke an alle. Ich habe das jetzt über FileStreamResult, wie david.m im zweiten Link erwähnt hat, gelöst.
P.S.
Natürlich gibt es Prüfungen bezüglich Berechtigungen, ob das File überhaupt existiert usw. Diese habe ich aber nicht mit angegeben, da sie ja für die Frage nicht relavant sind.
mfG
Thomas
Hallo
Ich habe eine ASP.NET Core Web-API die ich auf Version 6 umstellen soll. In dieser ist in einem Controller folgende Methode:
[HttpGet]
public async Task<IActionResult> GetDocument(string datei)
{
if (!ModelState.IsValid)
return BadRequest(ModelState);
try
{
WebClient client = new();
client.Credentials = CredentialCache.DefaultNetworkCredentials;
Task<byte[]> t = client.DownloadDataTaskAsync(new Uri(datei));
await t;
var file = t.Result;
return File(
file,
new ContentTypes().GetContentType(datei),
"_File" + Path.GetExtension(datei).ToLowerInvariant());
}
catch (Exception ex)
{
return BadRequest(ex.GetAll());
}
}
Der String für die Datei sieht wie folgt aus:
\\Server\Share\Directory\Filename
Jetzt meldet mir das System. dass "WebClient" deprecated ist und ich "HttpClient" statt dessen verwenden soll.
Nur erlaubt mir dieser nicht, eine Uri im Format "file://...." zu verwenden. Auch meine Recherche im Internet
hat mir keine Erkentniss darüber gebracht, wie ich dieses Problem lösen kann. Vielleicht habe ich nach den falschen Stichwörtern gesucht.
Kann mir vielleicht einer von Euch hierzu einen Tipp geben?
mfG
Thomas
Hallo
@dr4g0n76
Ich habe den Link eigentlich deshalb gepostet, vielleicht kannst Du hier Dir etwas abschauen, wie da die Berechnung gemacht wird, ob der Text gekürzt werden muss oder nicht. Daraus müsste sich doch dann ergeben, ob der Text ins Feld passt oder nicht.
mfG
Thomas
Hallo
Ich habe mal bei einem WPF-Projekt eine TextBox eingesetzt, die bei zu langem Text diesen abschneidet und durch "..." ersetzt. Dieses ist auf CodeProject zu finden. Vielleicht hilft Dir das ja.
mfG
Thomas