Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Portal
  • |
  • Mitglieder
Beiträge von BerndFfm
Thema: Wie funktioniert die Seitennavigation in MAUI?
Am im Forum: Cross Platform Entwicklung - Mobile und IoT


Ich würde eine weitere Seite öffnen.

Ein Fenster wo man das untere Fenster noch sieht benutzt man in der Regel auf Handys und Tablets nicht.



 Navigation.PushModalAsync(new SamplePage(), true);

...

Navigation.PopModalAsync(true)


Grüße Bernd

Thema: UI Themes zur Verwendung mit .NET MAUI
Am im Forum: Cross Platform Entwicklung - Mobile und IoT


Ich habe jetzt ja schon einige Bildschirme mit XAML in Xamarin.Forms gemacht und ich finde die Benutzerfreundlichkeit beim Entwerfen sehr schlecht.

Man muss viele Sachen manuell machen. Bei verschiedenen Auflösungen des Displays, kommt bei Handys dauernd vor, muss man Buttongröße und Schriftgröße selber per Programm anpassen.

Abstände und Abstand zum Rand muss man auch für jedes Auflösung und für jedes Gerät einzeln berechnen.

Einige Controls sind nicht brauchbar, so ist es seit Jahren bekannt dass der Datetime Picker im Darkmode schwarz auf schwarz darstellt. Ich hoffe das ist in Maui besser.

Grüße Bernd

Thema: MAUI.net Android - Auf externen Speicher zugreifen
Am im Forum: Cross Platform Entwicklung - Mobile und IoT


Die Berechtigung muss der Anwender manuell einstellen.

Beachte dass /storage/emulated/0/ im Handy Speicher gespeichert wird, /storage/sdcard1/ wird auf der SD-Card gespeichert.

Ich lese die beiden so :


 Parameter.SdCardPath = "";
Parameter.SdCardPath2 = "";
if (Build.VERSION.SdkInt ≥ BuildVersionCodes.Kitkat)   // ab API 19
{
    var dirs = GetExternalFilesDirs(null);
    if (dirs.Length > 1) Parameter.SdCardPath = dirs[1].AbsolutePath;
    if (dirs.Length > 1) Parameter.SdCardPath2 = dirs[0].AbsolutePath;
}


Grüße Bernd

Thema: Wie kann ich in C# aus einer zweiten Datei "2.cs" Buttons in "1.cs" verändern?
Am im Forum: Grundlagen von C#


So genau verstehe ich das nicht , aber ich glaube Du meinst :

[FAQ] Kommunikation von 2 Forms

Grüße Bernd

Thema: Daten aus txt-File einlesen und mit Datenbank vergleichen
Am im Forum: Datentechnologien

Zitat
Ich hoffe meine Ausgangslage ist verständlich ausgedrückt

Ja, geht so.

Wieso der Umweg über die Listen ? Man könnte doch die Daten beim Lesen direkt in der Datenbank verarbeiten.

Insert kann man so machen, aber unbedingt Parameter benutzen. Und keine Umlaute in Spaltennamen.

[Artikelserie] SQL: Parameter von Befehlen

Ist den zu 100% sicher dass es den Artikel noch nicht in der Datenbank gibt ?

Was soll passieren wenn es den Artikel schon gibt ?

Aus welcher Tabelle soll der Artikel gelöscht werden ?

In "pfad" hast Du den Dateinamen mit Pfad und in "file" hast Du die Extension.

Schreib besser so :


string file = openFileDialog.FileName;
string ext = Path.GetExtension(file);
if (ext == ".txt")
    ...

Grüße Bernd

Thema: Fehlermeldung bei Datenbank-Verbindung
Am im Forum: Datentechnologien

Bei Stackoverflow finde ich zu dem Fehler :

Zitat
I resolved it by using nuget package manager to install Mysql.Data and also installed System.Security.Permissions. This solved my problem.

Grüße Bernd

Thema: Schnapszahl finden
Am im Forum: Grundlagen von C#

Zitat von Apollo56
Also ich habe es so gemacht und wenn ich es Debugge und in einer textBox ausgebe funktioniert es auch. Gibt es Verbesserungsvorschläge?

Ja, das passt so.

Ich würde es so machen :


private bool PruefeSchnapszahl()
{
    string zahl = Int32.Parse(textBox1.Text).ToString();
    if (zahl.Length < 2) return false;
    for (int i = 1; i < zahl.Length; i++) if (zahl[i] != zahl[0]) return false;
    return true;
}

Grüße Bernd

Thema: Von einem C# Programm aus einen Linux Rechner steuern
Am im Forum: Rund um die Programmierung

SSH ist dafür gedacht. Skript ausführen :


string host = "...";
string cmd = "tar -cvzpf /home/backup/" + dir + @"_$(date +\%F_\%H\%M\%S).tar.gz www/" + dir + "/";
ConnectionInfo info = new ConnectionInfo(host, 22, "...", new AuthenticationMethod[] { new PasswordAuthenticationMethod("...", "...") });
SshClient client = new SshClient(info);
try
{
	client.Connect();
	Thread.Sleep(1000);
	while (!client.IsConnected) { }
	var result = client.RunCommand(cmd);
}
catch (Exception ex)
{
	Error("Fehler beim Verbinden mit der SSH Shell :\r\n\r\n" + ex.Message);
}
client.Disconnect();
client.Dispose();

Grüße Bernd

Thema: Inkompatibilität Xamarin Forms System.IO
Am im Forum: Cross Platform Entwicklung - Mobile und IoT

Eingebettete Resource lesen :


string file = "test.json";
using (StreamReader s = new StreamReader(Assembly.GetExecutingAssembly().GetManifestResourceStream("XamarinForms.LocationService.Resources." + file)))
{
	return s.ReadToEnd();
}
return "";

Grüße Bernd

Thema: Inkompatibilität Xamarin Forms System.IO
Am im Forum: Cross Platform Entwicklung - Mobile und IoT


Ich benutze File.ReadAllText(file) mit using System.IO, läuft einwandfrei.

Visual Studio 2019 mit Xamarin.Forms Version 5.0.0.

Da stimmt irgendwas nicht, denn das sollte auf Anhieb funktionieren.

Grüße Bernd

Thema: Fragen zum Sortieren
Am im Forum: GUI: Windows-Forms

Zitat von kstanger
-> BerndFfm: nein, not supported

In Xamarin.Forms wird es leider auch nicht supported so wie ich es gebraucht hätte.

Schnell ein Bubble Sort geschrieben, das klappt gut :


private void SortDevices(ref List<ListDevice> devices)
{
	if (devices.Count < 2) return;
	for (int j = 0; j < devices.Count - 1; j++)
		for (int k = j + 1; k < devices.Count; k++)
			if (IsGreater(devices[k], devices[j]))
			{
				ListDevice tdev = devices[j];
				devices[j] = devices[k];
				devices[k] = tdev;
				j = 0;
			}
}

Grüße Bernd

Thema: Fragen zum Sortieren
Am im Forum: GUI: Windows-Forms


Kannst Du Deine Liste nicht mit List<T>.Sort() sortieren ?

Grüße Bernd

Thema: Best Practise für Datenspeichern
Am im Forum: Basistechnologien und allgemeine .NET-Klassen


Ich benutze in einfachen Projekten auch immer eine Json-Datei für Settings.

Das hat viele Vorteile : Du musst dich nicht um Datentypen und -wandlung kümmern, man kann beliebig Einträge hinzufügen oder weglassen. Nur nachträglich keine Typen ändern.

Bei portablen Apps kann man die Json-Datei auch auf dem USB-Stick speichern.

Man kann auch einfach mehrere Settings anlegen und zwischen verschiedenen Settings umschalten.

Grüße Bernd

Thema: Objektname als Variable
Am im Forum: Grundlagen von C#


Ja, dafür ist der Name-Tag nicht gedacht gewesen.

Wir kennen zuwenig Anforderungen des Thread Erstellers um mehr Tipps geben zu können.

Ist es eine variable Anzahl ? Oder eine feste Anzahl ? Größer 10 ?

In WPF ist eine Liste mit Labels und Data Binding auf jeden Fall die bessere Lösung :


            <ListView x:Name="lvi_devices" ItemTapped="Listview_ItemTapped" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand">
                <ListView.Header>
                    <Grid ColumnDefinitions="1*" HorizontalOptions="FillAndExpand">
                        <Label Text="Name" FontSize="13" Grid.Column="0"></Label>
                    </Grid>
                </ListView.Header>
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <ViewCell>
                            <Grid ColumnDefinitions="1*" HorizontalOptions="FillAndExpand">
                                <Label Text="{Binding name}" FontSize="17" Grid.Column="0"></Label>
                            </Grid>
                        </ViewCell>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>

Grüße Bernd

Thema: Objektname als Variable
Am im Forum: Grundlagen von C#

Wenn Du die Labels im Code anlegst nach Bedarf dann kannst Du sie als Array anlegen und über Index ansprechen :


Label[] lbl = new Label[100];
...
lbl[i].Content = subs[i];

Wenn Du sie per Hand angelegt hast dann kannst Du nicht per Index ansprechen, aber andersrum geht es :


foreach (var child in ...Children)
    for(int i = 0; i < 100; i++)
    {
         if (child.Name = "lbl_"+ i.Tostring()) child.Content = subs[i];
    }

Wäre nicht eine Tabelle oder Grid besser für die Darstellung vieler Zahlen ?

Grüße Bernd

Thema: Error Handling in Xamarin Forms
Am im Forum: Cross Platform Entwicklung - Mobile und IoT


Ich benutze Android.Forms Version 5.0.0.2012+671 vom 2. Februar 2021.

Wenn es funktioniert ist es mir egal ob es deprecated ist.

Grüße Bernd

Thema: Error Handling in Xamarin Forms
Am im Forum: Cross Platform Entwicklung - Mobile und IoT


Hab im Android Projekt in der csproj-Datei den Eintrag

<DebugType>portable</DebugType>

geändert in
<DebugType>full</DebugType>

Jetzt wird die Stelle angezeigt wo der Fehler auftritt.

Schade dass das nicht die Standard Einstellung ist und auch nirgendwo dokumentiert ist.

Grüße Bernd

Thema: Error Handling in Xamarin Forms
Am im Forum: Cross Platform Entwicklung - Mobile und IoT


Ich habe Version 16.11.21, also die aktuellste Version.

Grüße Bernd

Thema: Error Handling in Xamarin Forms
Am im Forum: Cross Platform Entwicklung - Mobile und IoT


Der Fehler war in meinem C# Code.

Diese Anzeige bekomme ich bei jedem Fehler.

Breakpoint setzen und Debugging funktioniert.

Grüße Bernd

Thema: Error Handling in Xamarin Forms
Am im Forum: Cross Platform Entwicklung - Mobile und IoT

Leider zeigt mir das Visual Studio bei einem Fehler nie die Zeile an wo der Fehler auftritt. Das macht die Fehlersuche immer sehr schwierig.

Folgendes wird bei einem Fehler im Debug Mode angezeigt :

Fehler

Die Anwendung befindet sich im Haltemodus

Ihre App wurde angehalten, aber es gibt keinen anzuzeigenden Code, da alle Threads externen Code ausgeführt haben (normalerweise System- oder Frameworkcode).

Details anzeigen :

---------------------------
Microsoft Visual Studio
---------------------------
EXCEPTION: Mono.Debugger.Soft.VMNotSuspendedException: The vm is not suspended.

bei Mono.Debugger.Soft.VirtualMachine.ErrorHandler(Object sender, ErrorHandlerEventArgs args) in C:\A\1\5\s\External\debugger-libs\Mono.Debugger.Soft\Mono.Debugger.Soft\VirtualMachine.cs:Zeile 367.

bei Mono.Debugger.Soft.Connection.SendReceive(CommandSet command_set, Int32 command, PacketWriter packet) in C:\A\1\5\s\External\debugger-libs\Mono.Debugger.Soft\Mono.Debugger.Soft\Connection.cs:Zeile 1806.

bei Mono.Debugger.Soft.VirtualMachine.Resume() in C:\A\1\5\s\External\debugger-libs\Mono.Debugger.Soft\Mono.Debugger.Soft\VirtualMachine.cs:Zeile 139.

bei Mono.Debugging.Soft.SoftDebuggerSession.HandleEventSet(EventSet es) in C:\A\1\5\s\External\debugger-libs\Mono.Debugging.Soft\SoftDebuggerSession.cs:Zeile 1871.

bei Mono.Debugging.Soft.SoftDebuggerSession.EventHandler() in C:\A\1\5\s\External\debugger-libs\Mono.Debugging.Soft\SoftDebuggerSession.cs:Zeile 1772.
---------------------------
OK
---------------------------

Wie kann man erreichen dass beim VS 2019 bei Xamarin Forms die Zeile angezeigt wird wo der Fehler auftritt ?

Grüße Bernd

Thema: ComboBox mit großer Datenmenge
Am im Forum: GUI: Windows-Forms

Ein virtuelles ListView kann man nach Bedarf nachladen, so dauert die Anzeige von mehreren Millionen Datensätzen nur 0,2 Sekunden. Glaubt man.

Ich habe immer ein Suchfeld zum Eingrenzen und dann auf Knopfdruck ein ListView.

Grüße Bernd

Thema: For Loop mit Abzweigung
Am im Forum: Grundlagen von C#

Das muss natürlich dann so heißen :


txtWorkDays.Text = DaysAmount(dateStart, dateEnd, false).ToString();
txtHolidayDays.Text = DaysAmount(dateStart, dateEnd, true).ToString();

Vergiss bitte meinen Code von 13:05 Uhr, nimm lieber den vorherigen.

Sinn das alles in eine Methode zu packen macht es dann wenn es mal mehrere Arten von errechneten Werten geben soll.

Grüße Bernd

Thema: For Loop mit Abzweigung
Am im Forum: Grundlagen von C#

Sollte auch so gehen :


public int DaysAmount(DateTime dtpStart, DateTime dtpEnd, bool holidays)
{
    int days = 0;
    List<DateTime> holidaylist = HolidayDays();
    for (DateTime date = dtpStart; date ≤ dtpEnd; date = date.AddDays(1))
        if (!holidays && dtpStart.DayOfWeek != DayOfWeek.Sunday && !holidaylist.Contains(date)) days++;
        else days++;
    return days;
}

private List<DateTime> HolidayDays()
{
    List<DateTime> holidaylist = ...
    return holidaylist;
}

Grüße Bernd

Thema: For Loop mit Abzweigung
Am im Forum: Grundlagen von C#

Wenn Du nur eine Methode haben willst, die dann aber zweimal aufgerufen wird geht das auch so :



int wdays = DaysAmount(dtpStart, dtpEnd, false);
int hdays = DaysAmount(dtpStart, dtpEnd, true);

...

public int DaysAmount(DateTime dtpStart, DateTime dtpEnd, bool holidays)
{
    int days = 0;
    List<DateTime> holidaylist = HolidayDays();
    for (DateTime date = dtpStart; date ≤ dtpEnd; date = date.AddDays(1))
    {
        if (holidays && (dtpStart.DayOfWeek == DayOfWeek.Sunday || holidaylist.Contains(date))) days++;
        if (!holidays && dtpStart.DayOfWeek != DayOfWeek.Sunday && !holidaylist.Contains(date)) days++;
    }
    return days;
}

Sehe ich aber keinen so großen Vorteil.

Grüße Bernd

Thema: For Loop mit Abzweigung
Am im Forum: Grundlagen von C#

Auch in der Methode TestAmount stimmt die Logik nicht. Du gibst immer eine 1 zurück. Du willst aber sicher die Anzahl der Tage wissen.

Das könnte so aussehen :


public int HolidaysAmount(DateTime dtpStart, DateTime dtpEnd)
{
    int hdays = 0;
    List<DateTime> holiday = HolidayDays();
    for (DateTime date = dtpStart; date ≤ dtpEnd; date = date.AddDays(1))
        if (dtpStart.DayOfWeek == DayOfWeek.Sunday || holiday.Contains(date))
            hdays++;
    return hdays;
}

Du brauchst 2 Methoden weil Du ja 2 Werte berechnen willst. Oder Du nutzt eine Methode und übergibst die Werte per ref.

Grüße Bernd

Thema: Einfaches Deployment einer Xamarin Test-App
Am im Forum: Cross Platform Entwicklung - Mobile und IoT


Die kostenlose Variante ist sehr holprig, der kostenpflichtige Account ist da viel besser.

Deployment muss man auf dem Mac machen da auf einem Windows Rechner aus Sicherheitsgründen seit einiger Zeit keine private Key mehr gespeichert werden. Leider ist das kaum dokumentiert.

Das iPhone muss am Mac angeschlossen sein, zumindestens beim M1 Mac. Der Emulator auf dem Windows Rechner bringt leider nur einen schwarzen Bildschirm.

Ich freue mich dass mit MAUI das nun alles besser unterstützt wird, getestet habe ich es noch nicht.

Grüße Bernd

Thema: Heute kommt .NET 7
Am im Forum: Szenenews


Um 22:00 Uhr kommt .NET MAUI !

Thema: Kaufmännisch Runden
Am im Forum: Grundlagen von C#


Zumindestens bei Rechnungen gibt es in Deutschland genaue Vorschriften, und da muss nach jeden Zwischenschritt, der ausgegeben wird, gerundet werden.

Sonst erfüllt man die nicht Vorgaben für Rechnungen gemäß Umsatzsteuergesetz und den Grundsätzen der ordnungsgemäßen Buchführung.

Grüße Bernd

Thema: Kaufmännisch Runden
Am im Forum: Grundlagen von C#

Zitat von Abt
Kaufmännische Runden erfolgt, wenn man alles berechnet hat - am Ende.

Es wird nach jedem Zwischenschritt der ein Ergebnis ausgibt gerundet.

Sonst könnte man die Rechenschritte nicht nachvollziehen.

Grüße Bernd

Thema: Polynomkoeffizienten aus string in double[] parsen
Am im Forum: Grundlagen von C#


Selber einen Parser bauen, dazu brauchst Du Split(), SubString() und Double.Parse().

Oder Regex benutzen.

Grüße Bernd