Wie kann ich meinen Button Click so ändern, dass er immer automatisch ausgeführt wird, wenn meine TextBox nicht mehr leer ist?

Ich habe ein DataGrid bei dem ich mit MVVM die Daten beziehe. Jetzt habe ich es so gemacht das wenn ich diesen Button drücke:

<TextBlock Text="&#xE71C;" x:Key="DataGridSelectAllButtonStyle.Content"/>
                <Style x:Key="{ComponentResourceKey ResourceId=DataGridSelectAllButtonStyle, TypeInTargetAssembly={x:Type DataGrid}}"
                    TargetType="{x:Type Button}">
                    <Setter Property="Background" Value="Gray"/>
                    <Setter Property="BorderBrush" Value="White"/>
                    <Setter Property="BorderThickness" Value="0 0 1 0"/>
                    <EventSetter Event="Click" Handler="ClearButton_Click"/>
                    <Setter Property="Content">
                        <Setter.Value>
                            <StackPanel Background="Gray" Height="40" Width="11">
                                <Separator Background="White" Margin="0,17,-1,0"/>
                                <TextBlock Background="{x:Null}" HorizontalAlignment="Center" Height="13"  Margin="0 5 0 0"
                            FontFamily="Segoe MDL2 Assets" FontWeight="Light" FontSize="7"
                            Text="{Binding Text, Source={StaticResource DataGridSelectAllButtonStyle.Content}}">
                                </TextBlock>
                            </StackPanel>
                        </Setter.Value>
                    </Setter>
                </Style>

Und meine TextBoxen nicht leer sind sie dann automatisch geleert werden. Wenn jedoch die TextBoxen nicht leer sind und ich denn Button noch nicht gedrückt habe soll sich der Content von dem Button ändern zu einem Kreuz. Das habe ich bereits jedoch nur bedingt geschafft denn jetzt ist es bei mir so das nur wenn ich auf denn Button Clicke der Content geändert wird und nicht automatisch sobald er erkennt die TextBoxen sind nicht mehr leer. Also mein Ziel ist es das wenn die TextBoxen leer sind das standard Symbol (Content) angezeigt wird und sobald eine der TextBoxen nicht mehr leer sind soll sich der Button Content automatisch in ein Kreuz ändern und nicht wie jetzt das es nur manuell über das Klicken auf den Button funktioniert und sobald alle TextBoxen wieder leer sind soll das Anfangs Symbol(Content gezeigt werden). Und hier ist erstmal mein Code Behind womit ich denn Button content per Click event ändere:

private void ClearButton_Click(object sender, RoutedEventArgs e)
        {
            if (!String.IsNullOrEmpty(IDSearcBox.Text))
            {
                if (sender is FrameworkElement element)
                {
                    TextBlock textBlock = (TextBlock)element.FindResource("DataGridSelectAllButtonStyle.Content");
                    textBlock.Text = textBlock.Text == "\xE711"
                        ? "\xE71C"
                        : "\xE711";
                }
            }
        }
Computer, C Sharp, XAML, Windows Presentation Foundation
C# Kann nicht auf MySql DB (phpMyAdmin) zugreifen?

Ich wollte ein C# Programm schreiben um meine MySql Datenbank zu testen.
Das Programm soll sich mit der DB verbinden und die Datenbank Einträge in eine DataGridView eintragen. Den Code habe ich von hier: https://www.youtube.com/watch?v=SZqIjaizkTM&ab_channel=mhluc%23 (habe ihn aber ein bisschen verändert)
Ich komme jedoch nicht in die Datenbank rein.

Es gibt Probleme bei dem Connection.OpenAsync()

Hier die Exception:

MySql.Data.MySqlClient.MySqlException
 HResult=0x80004005
 Nachricht = Unable to connect to any of the specified MySQL hosts.
 Quelle = MySql.Data
 Stapelüberwachung:
  at MySql.Data.MySqlClient.NativeDriver.Open()
  at MySql.Data.MySqlClient.Driver.Open()
  at MySql.Data.MySqlClient.Driver.Create(MySqlConnectionStringBuilder settings)
  at MySql.Data.MySqlClient.MySqlPool.CreateNewPooledConnection()
  at MySql.Data.MySqlClient.MySqlPool.GetPooledConnection()
  at MySql.Data.MySqlClient.MySqlPool.TryToGetDriver()
  at MySql.Data.MySqlClient.MySqlPool.GetConnection()
  at MySql.Data.MySqlClient.MySqlConnection.Open()
  at System.Data.Common.DbConnection.OpenAsync(CancellationToken cancellationToken)
--- End of stack trace from previous location ---
  at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
  at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
  at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
  at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
  at VoidRaiderDB_Browser.MainWindow.<MenuStripItemClicked>d__3.MoveNext() in D:\Projects\VoidRaiderDB Browser\VoidRaiderDB Browser\MainWindow.cs:line 31

 Diese Ausnahme wurde ursprünglich von dieser Aufrufliste ausgelöst:
  [Externer Code]

Innere Ausnahme 1:
AggregateException: One or more errors occurred. (Es konnte keine Verbindung hergestellt werden, da der Zielcomputer die Verbindung verweigerte.)

Innere Ausnahme 2:
SocketException: Es konnte keine Verbindung hergestellt werden, da der Zielcomputer die Verbindung verweigerte.

glaube ich habe beim Connection String verkackt aber habe keine Ahnung was ich falsch gemacht habe..

Das Passwort/User-Name ist richtig da ich mit den auch in die phpMyAdmin Seite reinkomme

Bild zum Beitrag
Computer, Internet, Software, Technik, programmieren, C Sharp, Datenbank, Informatik, MySQL, Technologie, phpMyAdmin
Warum dauert dieser C# Task so lange?

Was ist beim Mischen von synchronen mit asynchronen Tasks in C# das Problem, sodass der folgende Code extrem lange zur Ausführung benbötigt?

var sema = new SemaphoreSlim(1);

var tasks = new List<Task>();

for (int i = 0; i < 20; i++)
{
    var t2 = Task.Run(async () =>
    {
        var sw = new Stopwatch();
        sw.Start();
        await sema.WaitAsync().ConfigureAwait(false);
        try
        {
            await Task.Delay(1).ConfigureAwait(false);
        }
        finally
        {
            sema.Release();
        }
        sw.Stop();
        Console.WriteLine($"sync {sw.Elapsed}");
    });

    var t1 = Task.Run(() =>
    {
        var sw = new Stopwatch();
        sw.Start();
        sema.Wait();
        try
        {
        }
        finally
        {
            sema.Release();
        }
        sw.Stop();
        Console.WriteLine($"async {sw.Elapsed}");
    });

    tasks.Add(t1);
    tasks.Add(t2);
}

await Task.WhenAll(tasks).ConfigureAwait(false);

Ausgabe: es dauert 16 Sekunden!!! Nur die erste Ausgabe ist schnell, der Rest nach 16 Sekunden.

sync 00:00:00.8306484
sync 00:00:16.8401071
... Rest

Nehme ich beide male synchrone Tasks, geht es wesentlich schneller:

var sema = new SemaphoreSlim(1);

var tasks = new List<Task>();

for (int i = 0; i < 20; i++)
{
    var t2 = Task.Run(async () =>
    {
        var sw = new Stopwatch();
        sw.Start();
        await sema.WaitAsync().ConfigureAwait(false);
        try
        {
            await Task.Delay(1).ConfigureAwait(false);
        }
        finally
        {
            sema.Release();
        }
        sw.Stop();
        Console.WriteLine($"sync {sw.Elapsed}");
    });

    var t1 = Task.Run(async () =>
    {
        var sw = new Stopwatch();
        sw.Start();
        await sema.WaitAsync().ConfigureAwait(false);
        try
        {
        }
        finally
        {
            sema.Release();
        }
        sw.Stop();
        Console.WriteLine($"async {sw.Elapsed}");
    });

    tasks.Add(t1);
    tasks.Add(t2);
}

await Task.WhenAll(tasks).ConfigureAwait(false);

Ausgabe: alles nach etwa 300ms fertig.

async 00:00:00.0180861
sync 00:00:00.3329542
...

Was passiert da im Hintergrund? Ich weiß, dass man snchrone mit asynchronen Tasks nicht mischen soll, aber die 16 Sekunden sind schon heftig und kommen fast einem Deadlock gleich. Was passiert nach 16 Sekunden, dass es dann plötzlich weitergeht ;-) ?

programmieren, C Sharp, Informatik

Meistgelesene Fragen zum Thema C Sharp