Laden...

Forenbeiträge von Mexxchen Ingesamt 70 Beiträge

17.04.2019 - 13:43 Uhr

Okay, wenn ich das aufklappe steht dort 41 siehe Bild. Und wenn ich Dich richtig verstehe, kann man da nix machen...

16.04.2019 - 12:58 Uhr

Hallo Abt,

vielen Dank für Deine Antwort. Im angehängten Bild ist die 55 (vom PC) zu sehen und vom Gerät kommen 60 Bytes. Was meinst Du, wo ich genauer gucken sollte?

12.04.2019 - 12:23 Uhr

Hallo liebes Forum,

lt. Elektronik-Kompendium und anderen Websites ist die minimale Framegröße im Ethernet ist 64 Byte. Die maximale Framelänge ist 1518 Bytes, bei Tagged-MAC-Frames 1522 Bytes. Es dürfen maximal 1500 Bytes an Nutzdaten in einem Frame übertragen werden.

Wir haben gerade das Problem, dass wir bei der Kommunikation mit unseren Geräten teilweise lt. Wireshark Pakete haben, welche die Mindestgröße nicht einhalten sondern nur 55 lang sind.

Es passiert z. B. bei dem Beispiel von MS Socket.Connected Property

Muss man am Socket dies noch einstellen oder wird dies über das Betriebssystem oder Netzwerkadapter geregelt.

Vielen Dank für Eure Hilfe!

21.01.2015 - 07:42 Uhr

Ich habe noch eine kleine Frage zu den Animationen. Ist es möglich, dass man die Bewegung auf der X-Achse dynamisch anpasst, wenn man die ViewBox weglassen will? Wenn ich den X-Value an z.B. die Width der Ellipse o. ä. binde (zum Test), kommt ein Fehler "Diese Storyboard-Zeitleistenstruktur kann nicht für die threadübergreifende Verwendung fixiert werden."
Die Bewgung auf der X-Achse soll quasi 'mitwachsen' wenn die Größenverhältnisse angepasst werden.

Edit: Laut diesem Link WPF animation: binding to the “To” attribute of storyboard animation scheint es nicht möglich zu sein. da muss man wohl mit einer ViewBox vorlieb nehmen, oder?

19.01.2015 - 16:53 Uhr

Hey Sarah, danke für die Bestätigung.

ich hab nun einiges probiert und bin zu folgendem Style gekommen, welcher meine gewollte Funktion erfüllt. Es kam dabei auch noch auf die Reihenfolge der Trigger an.

<Style x:Key="AnimatedSwitchStyle" TargetType="{x:Type ToggleButton}">
        <Setter Property="Background" Value="#FAFAFB"/>
        <Setter Property="BorderBrush" Value="#989898"/>
        <Setter Property="IsEnabled" Value="True"/>
        <Setter Property="IsChecked" Value="True"/>
        <Setter Property="Margin" Value="5"  />
        <Setter Property="Height" Value="20"  />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="ToggleButton">
                    <Viewbox Stretch="Uniform">
                        <Canvas Name="Layer_1" 
                                Width="20" 
                                Height="20" 
                                Canvas.Left="10"  
                                Canvas.Top="0">
                            <Ellipse  Canvas.Left="0" 
                                      Width="20"  
                                      Height="20"  
                                      Fill="{TemplateBinding Background}" Stroke="{TemplateBinding BorderBrush}" StrokeThickness="0.5"/>
                            <Ellipse  Canvas.Left="15"  
                                      Width="20"  
                                      Height="20"  
                                      Fill="{TemplateBinding Background}" Stroke="{TemplateBinding BorderBrush}" StrokeThickness="0.5"/>
                            <Border Canvas.Left="10"  
                                    Width="15"  
                                    Height="20"  
                                    Name="MyBorder" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="0,0.5,0,0.5"/>
                            <Ellipse x:Name="ellipse"  Canvas.Left="0" 
                                     Width="20"  
                                     Height="20"  
                                     Fill="White" Stroke="{TemplateBinding BorderBrush}" StrokeThickness="0.3">
                                <Ellipse.RenderTransform>
                                    <TranslateTransform X="0" Y="0" />
                                </Ellipse.RenderTransform>
                                <Ellipse.BitmapEffect>
                                    <DropShadowBitmapEffect Softness="0.1" ShadowDepth="0.7" Direction="270" Color="#BBBBBB"/>
                                </Ellipse.BitmapEffect>
                            </Ellipse>
                        </Canvas>
                    </Viewbox>
                    <ControlTemplate.Triggers>
                        <!-- Verändern des Sliders und der Farbe sofern checked = true oder false -->
                        <Trigger Property="ToggleButton.IsChecked" Value="True">
                            <Trigger.EnterActions>
                                <BeginStoryboard>
                                    <Storyboard>
                                        <!-- signalisieren, dass ToggleButton checked = true ist -->
                                        <ColorAnimation Storyboard.TargetProperty="Background.Color" To="#097de2" Duration="0:0:0.2" />
                                        <ColorAnimation Storyboard.TargetProperty="BorderBrush.Color" To="#097de2" Duration="0:0:0.2" />
                                        <!-- Slider nach rechts schieben -->
                                        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(Ellipse.RenderTransform).(TranslateTransform.X)" Storyboard.TargetName="ellipse">
                                            <SplineDoubleKeyFrame KeyTime="0" Value="0"/>
                                            <SplineDoubleKeyFrame KeyTime="0:0:0.4" Value="15" KeySpline="0, 1, 0.6, 1"/>
                                        </DoubleAnimationUsingKeyFrames>
                                    </Storyboard>
                                </BeginStoryboard>
                            </Trigger.EnterActions>
                            <Trigger.ExitActions>
                                <BeginStoryboard>
                                    <Storyboard>
                                        <!-- signalisieren, dass ToggleButton checked = false ist -->
                                        <ColorAnimation Storyboard.TargetProperty="Background.Color" To="#989898" Duration="0:0:0.2" />
                                        <ColorAnimation Storyboard.TargetProperty="BorderBrush.Color" To="#989898" Duration="0:0:0.2" />
                                        <!-- Slider nach links schieben -->
                                        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(Ellipse.RenderTransform).(TranslateTransform.X)" Storyboard.TargetName="ellipse">
                                            <SplineDoubleKeyFrame KeyTime="0" Value="15"/>
                                            <SplineDoubleKeyFrame KeyTime="0:0:0.3" Value="0" KeySpline="0, 0.5, 0.5, 1"/>
                                        </DoubleAnimationUsingKeyFrames>
                                    </Storyboard>
                                </BeginStoryboard>
                            </Trigger.ExitActions>
                        </Trigger>

                        <!-- ToggleButton ist aktiviert oder deaktiviert -->
                        <Trigger Property="ToggleButton.IsEnabled" Value="False">
                            <Trigger.EnterActions>
                                <BeginStoryboard x:Name="StoryboardLightGray">
                                    <Storyboard>
                                        <!-- signalisieren, dass ToggleButton nicht checkbar ist -->
                                        <ColorAnimation Storyboard.TargetProperty="Background.Color" To="#FAFAFB" Duration="0:0:0.2" />
                                        <ColorAnimation Storyboard.TargetProperty="BorderBrush.Color" To="#989898" Duration="0:0:0.2" />
                                    </Storyboard>
                                </BeginStoryboard>
                            </Trigger.EnterActions>
                            <Trigger.ExitActions>
                                <StopStoryboard BeginStoryboardName="StoryboardLightGray"/>
                            </Trigger.ExitActions>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
19.01.2015 - 14:14 Uhr

Ich habe gerade mal den Style in Blend überprüft. Dort verhält der sich wunderbar....sehr seltsam.

19.01.2015 - 12:49 Uhr

Hallo zusammen,

ich benötige Eure Hilfe und bedanke mich schonmal im Voraus.

Ich habe einen Style für einen ToggleButton. Dieser TB soll nach links und rechts sliden und dabei noch seine Farbe anpassen. Natürlich auch noch unter Beachtung seines Enabled-Status.
Gleichzeitig soll er die vorher aktive Farbe bei IsEnabled = True wieder erhalten. Der Style ansich funktioniert, aber leider nicht von Anfang an. Der TB ist, obwohl enabled und checked wie disabled und unchecked. Erst wenn man einmal drauf geklickt hat funktioniert er wie gefordert.

Gebunden ist der TB im View an ein ViewModel und die Werte werden auch korrekt abgeholt und gesetzt....

Ich habe auch hier im Forum gelesen, dass die Storyboards gestoppt werden sollten, das habe ich noch mit eingebaut.

Hat vielleicht jemand eine Idee, woran es liegen könnte?

<Style x:Key="AnimatedSwitchStyle" TargetType="{x:Type ToggleButton}">
        <Setter Property="Background" Value="#FAFAFB"/>
        <Setter Property="BorderBrush" Value="#989898"/>
        <Setter Property="IsEnabled" Value="True"/>
        <Setter Property="IsChecked" Value="True"/>
        <Setter Property="Margin" Value="5"  />
        <Setter Property="Height" Value="20"  />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="ToggleButton">
                    <ControlTemplate.Resources>
                        <Storyboard x:Key="StoryboardBlue">
                            <ColorAnimation Storyboard.TargetProperty="Background.Color" To="#097de2" Duration="0:0:0.2" />
                            <ColorAnimation Storyboard.TargetProperty="BorderBrush.Color" To="#097de2" Duration="0:0:0.2" />
                        </Storyboard>
                        <Storyboard x:Key="StoryboardGray">
                            <ColorAnimation Storyboard.TargetProperty="Background.Color" To="#989898" Duration="0:0:0.2" />
                            <ColorAnimation Storyboard.TargetProperty="BorderBrush.Color" To="#989898" Duration="0:0:0.2" />
                        </Storyboard>
                        <Storyboard x:Key="StoryboardLightGray">
                            <ColorAnimation Storyboard.TargetProperty="Background.Color" To="#FAFAFB" Duration="0:0:0.2" />
                            <ColorAnimation Storyboard.TargetProperty="BorderBrush.Color" To="#989898" Duration="0:0:0.2" />
                        </Storyboard>
                        <Storyboard x:Key="StoryboardRight">
                            <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(Ellipse.RenderTransform).(TranslateTransform.X)" Storyboard.TargetName="ellipse">
                                <SplineDoubleKeyFrame KeyTime="0" Value="0"/>
                                <SplineDoubleKeyFrame KeyTime="0:0:0.4" Value="15" KeySpline="0, 1, 0.6, 1"/>
                            </DoubleAnimationUsingKeyFrames>
                        </Storyboard>
                        <Storyboard x:Key="StoryboardLeft">
                            <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(Ellipse.RenderTransform).(TranslateTransform.X)" Storyboard.TargetName="ellipse">
                                <SplineDoubleKeyFrame KeyTime="0" Value="15"/>
                                <SplineDoubleKeyFrame KeyTime="0:0:0.3" Value="0" KeySpline="0, 0.5, 0.5, 1"/>
                            </DoubleAnimationUsingKeyFrames>
                        </Storyboard>
                    </ControlTemplate.Resources>
                    <Viewbox Stretch="Uniform">
                        <Canvas Name="Layer_1" 
                                Width="20" 
                                Height="20" 
                                Canvas.Left="10"  
                                Canvas.Top="0">
                            <Ellipse  Canvas.Left="0" 
                                      Width="20"  
                                      Height="20"  
                                      Fill="{TemplateBinding Background}" Stroke="{TemplateBinding BorderBrush}" StrokeThickness="0.5"/>
                            <Ellipse  Canvas.Left="15"  
                                      Width="20"  
                                      Height="20"  
                                      Fill="{TemplateBinding Background}" Stroke="{TemplateBinding BorderBrush}" StrokeThickness="0.5"/>
                            <Border Canvas.Left="10"  
                                    Width="15"  
                                    Height="20"  
                                    Name="MyBorder" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="0,0.5,0,0.5"/>
                            <Ellipse x:Name="ellipse"  Canvas.Left="0" 
                                     Width="20"  
                                     Height="20"  
                                     Fill="White" Stroke="{TemplateBinding BorderBrush}" StrokeThickness="0.3">
                                <Ellipse.RenderTransform>
                                    <TranslateTransform X="0" Y="0" />
                                </Ellipse.RenderTransform>
                                <Ellipse.BitmapEffect>
                                    <DropShadowBitmapEffect Softness="0.1" ShadowDepth="0.7" Direction="270" Color="#BBBBBB"/>
                                </Ellipse.BitmapEffect>
                            </Ellipse>
                            <Label x:Name="Test" Content="Hallo" Width="500"/>
                        </Canvas>
                        
                    </Viewbox>

                    <ControlTemplate.Triggers>
                        <Trigger Property="ToggleButton.IsEnabled" Value="False">
                            <Trigger.EnterActions>
                                <BeginStoryboard x:Name="BeginStoryboardLightGray" Storyboard="{StaticResource StoryboardLightGray}"/>
                            </Trigger.EnterActions>
                            <Trigger.ExitActions>
                                <StopStoryboard BeginStoryboardName="BeginStoryboardLightGray"/>
                            </Trigger.ExitActions>
                            <Setter TargetName="Test" Property="Content" Value="IsEnabled"></Setter>
                        </Trigger>

                        <Trigger Property="ToggleButton.IsChecked" Value="True">
                            <Trigger.EnterActions>
                                <BeginStoryboard x:Name="BeginStoryboardRight" Storyboard="{StaticResource StoryboardRight}"/>
                            </Trigger.EnterActions>
                            <Trigger.ExitActions>
                                <StopStoryboard BeginStoryboardName="BeginStoryboardRight"/>
                            </Trigger.ExitActions>
                            <Setter TargetName="Test" Property="Content" Value="IsChecked"></Setter>
                        </Trigger>

                        <Trigger Property="ToggleButton.IsChecked" Value="False">
                            <Trigger.EnterActions>
                                <BeginStoryboard x:Name="BeginStoryboardLeft" Storyboard="{StaticResource StoryboardLeft}"/>
                            </Trigger.EnterActions>
                            <Trigger.ExitActions>
                                <StopStoryboard BeginStoryboardName="BeginStoryboardLeft"/>
                            </Trigger.ExitActions>
                            <Setter TargetName="Test" Property="Content" Value="IsNotChecked"></Setter>
                        </Trigger>

                        <MultiTrigger >
                            <MultiTrigger.Conditions>
                                <Condition Property="ToggleButton.IsChecked" Value="True"/>
                                <Condition Property="ToggleButton.IsEnabled" Value="True"/>
                            </MultiTrigger.Conditions>
                            <MultiTrigger.EnterActions>
                                <BeginStoryboard x:Name="BeginStoryboardBlue2" Storyboard="{StaticResource StoryboardBlue}"/>
                            </MultiTrigger.EnterActions>
                            <MultiTrigger.ExitActions>
                                <StopStoryboard BeginStoryboardName="BeginStoryboardBlue2"/>
                            </MultiTrigger.ExitActions>
                            <Setter TargetName="Test" Property="Content" Value="IsEnabled und IsChecked"></Setter>
                        </MultiTrigger>

                        <MultiTrigger >
                            <MultiTrigger.Conditions>
                                <Condition Property="ToggleButton.IsChecked" Value="False"/>
                                <Condition Property="ToggleButton.IsEnabled" Value="True"/>
                            </MultiTrigger.Conditions>
                            <MultiTrigger.EnterActions>
                                <BeginStoryboard x:Name="BeginStoryboardGray2" Storyboard="{StaticResource StoryboardGray}"/>
                            </MultiTrigger.EnterActions>
                            <MultiTrigger.ExitActions>
                                <StopStoryboard BeginStoryboardName="BeginStoryboardGray2"/>
                            </MultiTrigger.ExitActions>
                            <Setter TargetName="Test" Property="Content" Value="IsEnabled und IsNotChecked"></Setter>
                        </MultiTrigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
02.08.2013 - 09:11 Uhr

Das 4.5 ein Inplace-Upgrade weiß ich und habe es auch im allerersten Post angemerkt.
Das 4.0 Client und 4.0 Full nicht gleich sind, ist mir auch klar. Dennoch werden beide zusammen installiert und wir benötigen für unsere Zwecke auch nur Client.

Ich hatte mir nur erhofft, dass jemand ähnliche Erfahrung gemacht hat.

Code zu zeigen, ist in dem Projekt nicht ganz einfach, bzw. nicht gerne gesehen. Ich werde mich mit meinen Kollegen nach ihrer Urlaubszeit beraten und ggfs. Rückmeldung geben.

01.08.2013 - 15:21 Uhr

Alle Projekte haben als Zielframework .NET 4. In der app.config steht:

 <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0,Profile=Client" />

Würde der Compiler nicht Alarm schlagen, wenn etwas aus dem .NET 4.5 verwendet würde?

Debuggen ist zumindest mit VS2012 nicht möglich. Dazu muss man wohl mit nem sauberen Windows 7, .Net 4 und VS2010 ran.

@Abt: Wie ist Deine Frage gemeint?

01.08.2013 - 11:26 Uhr

Habe es gerade auf Win 7 getestet. Die Anwendung mit .Net 4 installiert. Der Fehler trat auf. Dann das Update 4.0.3 aus dem Link. Der Fehler ist weiterhin vorhanden. Installation von 4.5 behob den Fehler.

01.08.2013 - 10:37 Uhr

Muss ich mal prüfen. Danke für den Hinweis. Das gleiche gilt sicherlich auch für Win 7?

30.07.2013 - 12:49 Uhr

Die ursprüngliche Frage war ja damals bei Einführung des neuen Frameworks. Demnach sollte alles glatt laufen.

Ich versuche es mal kurz. Es passiert, wenn man in einem Listview z.B. nach unten scrollt, dann den aktuellen Vorgang abbricht und dann wieder hineinwechselt. Dann kommt die Exception > Fehlermeldung:

System.InvalidOperationException: Cannot call StartAt when content generation is in progress Die kommt wie geschrieben nur auf Rechnern ohne .NET4.5. Ich konnte sie in einer Virtuellen Maschine mit Win7 nachstellen. Als ich dort VS2012 installierte, um zu debuggen, trat sie nicht mehr auf.
Ein Installieren des 4.5er auf den Testrechnern behob ebenfalls den Fehler.

30.07.2013 - 12:29 Uhr

Ich muss mich nochmal kurz zu dem Thema zurückmelden.

Es scheint doch Probleme mit den Frameworks zu geben. Wir haben auf unseren Win7 Rechnern VS2012 und somit auch .NET 4.5. Um von XP bis Win 8 zu unterstützen, kompilieren wir auf .NET 4.

Im Test ist nun ein kurioser Fehler aufgetreten, welcher weder auf unseren Entwicklungsrechnern noch auf Win8 auftritt. Unter Win7 konnte dieser behoben werden, als wir dort .NET 4.5 nachinstalliert haben.

Als Erklärung habe ich folgendes gefunden: Neu in .NET4.5 und Worauf Sie bei .NET 4.5 und .NET 4.0 achten sollten

Ist Euch das bekannt (Auch wenn es schon ne Weile her ist)?

05.04.2013 - 10:10 Uhr

Hallo, danke für die Hinweise.

04.04.2013 - 12:06 Uhr

Hallo, ich kann pro Sekunde etwas bekommen...oder auch nicht. Das heißt aber nicht, dass die Verbindung gekappt ist.
Beispiel: Verbindung mit Gerät wird aufgebaut und Timer startet (1/s). Am Gerät starte ich eine Ausgabe z.B. aus dem internen Speicher oder durch Start eines Gerätezyklus mit gleichzeitiger Ausgabe. Wenn alles übertragen ist, geht's in die Mittagspause und es passiert 30min nichts. Die Verbindung ist trotzdem ok...der Timer ließt vom Socket 0 Bytes etc.
Ich könnte selber z.B. einen String alle 5 min senden und die Antwort abwarten. Dazu muss in der Geräte-SW das Antwortverhalten implementiert werden...

Der Standard-Keep-Alive Timeout ist glaub ich 2h o.ä.

25.02.2013 - 10:24 Uhr

Hallo weismat,

ich nutze die Socket-Klasse und verbinde mich per Connect mit dem Gerät (Server), oder was meinst Du genau? Im Prinzip bin ich nur 'hörend' verbunden. D. h. ich empfange in einem Timer (sekündlich) Daten ...oder auch nicht 😃

Ich hatte bisher die Möglichkeit genutzt, in der ich zyklisch ein leeres Byte.Array sende und anhand der SocketException erkenne, ob die Verbindung ok ist.

Nun wurde der Wunsch geäußert, dass mit dem Standard-Keepalive zu versuchen. Ich kann es ja auch aktivieren und sehe auch die Packete in Wireshark, aber ich bekomme es leider nicht in meiner Anwendung mit.

25.02.2013 - 08:21 Uhr

Hallo zusammen,

ich habe eine TCP-Verbindung von einer Applikation zu einem externen Gerät. Dieses sendet mir Daten, welche ich verarbeite und in eine Datei schreibe. Nun möchte ich einen Verbindungsabbruch des Sockets erkennen.
Als eine Möglichkeit nutze ich das Beispiel von Microsoft wie auch in diesem Thread

Nun wollte ich die Möglichkeit des Keepalive probieren. Dazu habe ich in einem Beipiel gefunden, dass man das per Socket.IOControl machen kann TCP keepAlive settings problem
Per Wireshark sehe ich, dass die Packete gesendet werden. Wie erkenne ich jetzt bei mir in der Appliaktion, dass das Keepalive fehlgeschlagen ist?

19.02.2013 - 10:20 Uhr

Schön schön...es funktioniert. Vielen Dank 👍

19.02.2013 - 09:20 Uhr

Hallo,

ich habe einen Button, der mit Hilfe eines Path ein Plus oder ein Minus haben soll. Ich versuche dieses nun in Anhängigkeit einer Textbox, welche sich auf meiner View befindet zu triggern. Also wenn der Text leer ist, dann soll ein Plus zu sehen sein und wenn Text vorhanden ist, dann entsprechend das Minus. Leider funktioniert der Trigger nicht. Kann mir jemand auf die Sprünge helfen?

<Button Grid.Column="1" Grid.Row="1" 
                    Command="{Binding Path=HandleAdditionalReasonCommand, UpdateSourceTrigger=PropertyChanged}" >
                <StackPanel Orientation="Horizontal">
                    <Path Name="Test" VerticalAlignment="Center"  Margin="5" Data="M 0 0 L 18 0 18 6 0 6Z" Fill="#FF626262">
                        <Path.Resources>
                            <Style TargetType="{x:Type Path}">
                                <Style.Triggers>
                                    <DataTrigger Binding="{Binding ElementName=AdditionalRefuseReasonTextBox, Path=Text}" Value="">
                                        <Setter Property="Data" Value="M 0 6 L 6 6 6 0 12 0 12 6 18 6 18 12 12 12 12 18 6 18 6 12 L 0 12 Z" />
                                    </DataTrigger>
                                </Style.Triggers>
                            </Style>
                        </Path.Resources>
                    </Path>
                </StackPanel>
            </Button>
23.01.2013 - 09:25 Uhr

Hallo, Touch geht soweit. Probleme macht im Moment nur Drag+Drop. Mit mouse gehts ohne nicht. Die Controls sind auch alle etwas größer, um sie mit dem Finger treffen zu können.

21.01.2013 - 09:03 Uhr

Hallo,

ich suche Rat zu folgendem Problem:
Wir haben eine Anwendung welche zur Zeit nur auf Keyboard+Mouse unter XP und Win7 läuft bzw. ausgerichtet ist. Zusätzlich haben wir es auf einem Windows 8 Gerät mit Touch-Display getestet. Es ist ausführbar und läßt sich auch ohne Probleme mit Mouse und Hardwarekeyboard bedienen. Bei diesem Gerät kann man die Tastatur umklappen und es so zu einem Tablet umfunktionieren. Das Problem dabei ist nun die Texteingabe in Textboxen o.ä. Beim Klich oder Touch in eine Textbox aktiviert sich die virtuelle Tastatur nicht. Gleichzeitig sollte sie sich nicht automatisch aktivieren, wenn die Hardwaretastatur aktiv ist.

Hat schon jemand Erfahrung mit einem ählichen Problem?

24.09.2012 - 10:18 Uhr

Nachtrag: Die Firewall war schuld, dass ich in Wireshark nix gesehen habe. Jetzt läuft alles.

Mit Socket.Bind() gehe ich nun durch alle meine IPs und finde nun meine Drucker 👍

24.09.2012 - 07:55 Uhr

Ich nochmal 😁

Jetzt funktioniert es!!!

Ich habe einfach aus der Methode BroadCastSend (siehe oben) die Zeile

bcSocket.Connect(new IPEndPoint(IPAddress.Broadcast, port));

entfernt und es klappt. Ich bekomme sofort die Antwort und kann diese nun parsen.

Zitat von Socket.Connect_Methode:

....Wenn Sie ein verbindungsloses Protokoll wie UDP verwenden, muss Connect nicht vor dem Senden und Empfangen von Daten aufgerufen werden. Sie können über SendTo und ReceiveFrom synchron mit einem Remotehost kommunizieren. Wenn Sie Connect doch aufrufen, werden alle Datagramme verworfen, die von einer anderen als der angegebenen Standardadresse eingehen.....

Was nun noch etwas verwundert ist, dass ich in Wireshark meine gesendetetn Daten nicht mehr sehe...nur die Antwort.... ?(

24.09.2012 - 07:37 Uhr

Danke für die Antworten.

Mit 'Übeltäter' meinte ich scherzhaft die konfigurierten IP-Adressen auf meinem Rechner.
Das ist einmal 192.168.57.22 und 192.168.40.67 Der Drucker, den ich ansprechen möchte, hat die 192.168.40.64. Wenn ich als primäre IP die aus dem selben Subnetz nehme, dann sehe ich in Wireshark unmittelbar nach dem Senden des Broadcast die Antwort des Druckers. Jetzt muss ich sie ja nur noch im Programm auswerten. Und das klappt nicht.
Wie ist denn die richtige Vorgehensweise?

21.09.2012 - 13:25 Uhr

Hey, Danke für deine Antwort.

Ich habe mir eine kleine Funktion geschrieben, welche die lokalen Adressen durchsucht. Ich bekomme auch die 'übeltäter' aber weiss nicht , wie ich den Broadcast konfigurieren soll, dass er für jede gefundene Adresse ausgeführt wird.


 private static List<IPAddress> GetIpAddresses()
        {
            List<IPAddress> addresses = new List<IPAddress>();
            foreach (NetworkInterface netif in NetworkInterface.GetAllNetworkInterfaces())
            {

                IPInterfaceProperties properties = netif.GetIPProperties();

                foreach (IPAddressInformation unicast in properties.UnicastAddresses)
                {
                    if (unicast.IsDnsEligible && unicast.Address.AddressFamily != AddressFamily.InterNetworkV6)
                    {
                        addresses.Add(unicast.Address);
                        Console.WriteLine(unicast.Address);
                    }
                }

            }
            return addresses;
        }

Wenn ich meinen Rechner mit der passenden IP konfiguriere, bekomme ich beim Receive ein Timeout... hätte eigentlich gedacht, dass das klappen müßte. In Wireshark sehe ich ja bereits die zurückgegebenen Infos.
Also sind die Probleme: Senden des Broadcast für jede lokale Adresse und das entsprechende Empfangen.

21.09.2012 - 12:04 Uhr

Hallo zusammen,

ich bin nun schon eine Weile am Suchen, bin nun aber auf Eure Hilfe angeweisen.

Ich möchte per UDP einen String an ein Gerät im Netzwerk senden, um aus dessen Antwort seine IP zu ermitteln. Das soll dazu dienen, dem Gerät Kommandos zu schicken, wenn es per DHCP verbunden ist.

Die Nachricht "BG" schicke ich per Broadcast an den Port 3000. In Wireshark sehe ich auch, dass die Nachricht rausging. Allerdings habe ich Probleme mit dem Empfangen der Antwort.

Zum Senden/Empfangen nutze ich folgendes:


Byte[] sendBytes = Encoding.ASCII.GetBytes("BG");
            try
            {

                BroadCastSend(sendBytes, IPAddress.Broadcast, 3000);

            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }

public static void BroadCastSend(byte[] data, IPAddress ip, int port)
        {
            try
            {
                // Socket definieren
                Socket bcSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

                bcSocket.Connect(new IPEndPoint(IPAddress.Broadcast, port));

                // EndPoint definieren bzw. Ziel des Broadcastes
                IPEndPoint iep = new IPEndPoint(ip, port);

                // Optionen auf den Socket binden
                bcSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1);

                // Broadcast senden
                bcSocket.SendTo(data, iep);

                bcSocket.ReceiveTimeout = 5000;

                byte[] test = new byte[1024];
                bcSocket.Receive(test);

                // Socket schliessen, nach erfolgreichem Senden des Broadcastes
                bcSocket.Close();
            }
            catch (Exception exc)
            {
                Console.WriteLine(exc.Message);
            }
        }

Mein PC hat in der Netzwerkadapterkonfiguration mehrere IP-Adressen. Unter denen befindet sich auch eine Adresse aus dem gleichen Subnetz wie das externe Gerät.

Kann das Problem daran liegen, dass der Broadcast standardmäßig nur mit der 'primären' IP-Adresse gesendet wird, welche nicht aus dem Subnetz des externen Gerätes stammt? Kann man den Broadcast über alle eingetragenen IPs durchführen?

16.08.2012 - 13:57 Uhr

Vielen Dank für Eure Antworten.

Es klang in einigen Berichten und Kommentaren so, dass durch das Update auf FW4.5 Bibliotheken des FW4.0 verändert werden. Die Installation erfolgt auch in das gleiche Verzeichnis unter C:\Windows\Microsoft.NET\Framework.

Wir haben da nur Bedenken, dass Anpassungen an 4.0-Assemblies vorgenommen werden. Diese Änderungen wären ja unter FW4.0 auf XP nicht vorhanden.

Zitat von: Was ist neu im Microsoft .NET Framework 4.5?
.NET 4.5 kann im wesentlichen als ein Add-On zu .NET 4.0 verstanden werden. Allerdings nimmt das Setup von .NET 4.5 auch kleinere Änderungen an der CLR 4.0 vor.

Microsoft nennt .NET 4.5 ein "In-Place-Update", d.h.

  • .NET 4.5 installiert sich im gleichen Ordner wie .NET 4.0
  • Wenn .NET 4.0 schon vorhanden ist, wird dies überschrieben
  • Wenn .NET 4.5 deinstalliert wird, wird auch .NET 4.0 deinstalliert
  • Die CLR hat in .NET 4.5 die gleiche Runtime 4.0.30319.*. Lediglich die vierte Stelle (Build-Nummer) ist anders
    Runtime 4.0.30319.269 -> .NET 4.0
    Runtime 4.0.30319.17626 -> .NET 4.5
  • Eine .NET 4.5-Anwendung wird auf .NET 4.0 laufen, bis ein Feature von .NET 4.5 gebraucht wird
16.08.2012 - 12:24 Uhr

Hallo zusammen,

wir bei uns ein Thema, welches zu Diskussionen führt. Dabei geht es um folgendes:

Durch die Installation von VS2012 wird ja ebenfalls das FW4.5 installiert. Dieses ersetzt Teile des bisherigen FW4.0 (In-place upgrade).
Wenn wir nun Anwendungen entwickeln, welche ebenfalls noch Win-XP unterstützen sollen, können wir dort max. auf das FW4.0 zurückgreifen, richtig?

Stellen wir nun im VS2012 das Zielframework auf 4.0 ein und kompilieren auf unseren Entwicklungsrechnern, führt dieses dann zwangsläufig zu Problemen unter XP? Das FW4 auf dem Entwicklungsrechner ist ja im Prinzip nicht mehr das selbe wie auf einem XP-Zielrechner...

Vielleicht kann jemand von Euch etwas Licht ins Dunkle bringen.

08.02.2012 - 11:39 Uhr

Danke für die Info. Ich nutze die DLL nur und manipuliere sie nicht. Demnach sollte es keine Probleme geben...

08.02.2012 - 08:14 Uhr

Hallo.

wenn ich das HtmlAgilityPack nutzen würde, wie sieht es da mit der Lizenz aus? Laut Wikipedia ist die kommerzielle Nutzung "einfach möglich" Microsoft Public License

07.02.2012 - 14:55 Uhr

Habe die dll auf dem XP-Rechner in C:\Windows\assembly testweise kopiert, aber hat auch nix gebracht. Auch nicht im System32-Ordner... Das ist aber auch wie verhext.

07.02.2012 - 14:18 Uhr

Ich habe auf meinem Rechner IE8. In meinem XP.Mode ist IE6. Auf beiden läufts, es ist aber auch VS installiert.
Auf den Vista-Rechner ist auch IE8 und auch dort läufts.
Ich habe es gerade auch noch einmal auf dem Pc eines Kollegen mit Win7 probiert. Auch dort keine Probleme.

Auf dem XP Rechner ist IE7.

Kann es sein, dass die dll auch durch irgendeine Frameworkinstallation oder ähnliches installiert wird?

07.02.2012 - 13:23 Uhr

Ich bin durch damalige Recherche darauf gekommen. Und das Tool läuft ja auch auf den meisten Rechner ohne Probleme. Will nun nicht alles umstellen.

07.02.2012 - 12:34 Uhr

Hallo,

ich habe weitere Sachen probiert:

Bei meiner Suche habe ich gelesen, dass es am falschen Zielsystem beim Kompilieren liegen kann. Ich habe überall Release|x86 zu stehen und es brachte auch keine Besserung.

Ich habe auf meinem Rechner (Win7 x64) im Verzeichnis C:\Windows\assembly die dll gefunden... auch auf den anderen Vista und Win7-Maschinen. Allerdings nicht auf den XP-REchnern. In meinem XP-Mode ist es ebenfalls enthalten, doch das kann an der VS2010 dort drin liegen...
Muss ich die dll für XP im System registrieren? In vielen Posts habe ich gelesen, dass es ausreicht, wenn die dll im Programmverzeichnis liegt.
Was wäre der richtige Weg, regasm oder regsvr32? Das ganze muss auf jedem anderen Rechner laufen können. mit regasm kann man sich eine Registrydatei erzeugen, richtig?

06.02.2012 - 17:00 Uhr

Hallo,

wie im Thema erwähnt habe ich Probleme mit der Microsoft.mshtml.dll und komme trotz Recherche nicht zur Lösung.

Ich habe ein elektr. Gerät, welches einen Webserver enthält und man kann über die interne Webseite Gerätedaten auslesen. Dies soll nun mittels .Net-Anwendung geschehen, so dass man die Webseite nicht extra öffnen muss.
Um an die Daten zu kommen nutze ich die Microsoft.mshtml.dll. Das klappt auf meinem Rechner (Win7, VS2010, C#) bereits super. Auch auf zwei weiteren Testrechnern mit Vista und Win7 funktioniert das Programm. Nur auf einem XP-Rechner (SP3) bekomme ich immer folgenden Fehler:

Fehlermeldung:
"System.__ComObject" kann nicht in den Klassentyp "mshtml.HTMLSpanElementClass" umgewandelt werden. COM-Komponenten, die in die CLR eintreten und IProvideClassInfo nicht unterstützen oder die keine registrierte Interop-Assembly aufweisen, werden in den __ComObject-Typ eingebunden. Instanzen dieses Typs können in keine andere Klasse umgewandelt werden. Eine Umwandlung in Schnittstellen ist jedoch möglich, sofern die zugrunde liegende COM-Komponente QueryInterface-Aufrufe für die IID der Schnittstelle unterstützt.

Ich habe gelesen, dass es verschiedene Versionen der dll gibt und das man die Version aus den PIA-Verzeichnis des .Net nehmen soll und nicht die aus dem Office-Verzeichnis. Die dll ist auch in meinem Ausführungsverzeichnis vorhanden...trotzdem kommen die Fehler.
Wir haben auch .Net 2 SP2, .Net 3 SP2 und .Net 3.5 SP1 nachinstalliert.

Ich habe mir auf meinem PC den XP-Mode installiert und dort funktioniert es auch einwandfrei.
Was könnte die Ursache sein?

07.12.2011 - 11:03 Uhr

Ok, danke für die gute Hilfe.

07.12.2011 - 10:36 Uhr

Ich habe es in der Zwischenzeit mit dem Beispiel aus dem Beitrag Alle geöffneten Fenster eines Prozesses ermitteln geschafft.

ich habe die Methode EnumWindowsProc so erweitert, dass ich dort auf meine ProcessId prüfe und das Handle in eine Liste schreibe. Nun bekomme ich die Handles zu meinen Fenstern und ich kann sie wieder in den Vordergrund holen.

private static bool EnumWindowsProc(IntPtr hWnd, int lParam)
        {
            string strTitle = GetWindowText(hWnd);
            if (strTitle != "" & IsWindowVisible(hWnd)) //
            {
                uint pid;
                GetWindowThreadProcessId(hWnd, out pid);

                if (pid == ProcessId)
                {
                    lstTitles.Add(hWnd, strTitle);
                }
            }
            return true;
        }
07.12.2011 - 08:47 Uhr

Hallo Lynix,

danke für Deine Antwort.

Sobald die Methode EnumWindows durch alle handles geht, prüfe ich ob die dazugehörige ProzessId der entspricht, welche ich in meiner Liste habe. Wenn dies true ist, dann soll das Fenster mit dem Handle angezeigt werden. Dies führte dazu, dass z.B. auch eine ausgeklappte ComboBox angezeigt wurde und nicht das Fenster.

Ich versuche jetzt mit der MEthode IsWindow zu prüfen, ob es sich um ein Fenster handelt, aber auch das gibt keine Veränderung.

Beispiel aus dem Test:


        [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
        public static extern bool IsWindow(IntPtr hWnd);

        public bool Report(int hwnd, ref SearchData data)
        {
            Console.WriteLine("Window handle is " + hwnd);
          
            uint pid;
            IntPtr x = new IntPtr(hwnd);
            GetWindowThreadProcessId(x, out pid);
            Console.WriteLine("pid " + pid);

            if(pid == GetCurrentProcessId())
            {
                if (IsWindow(x))
                {
                    int returnSW = ShowWindow(hwnd, SW_RESTORE);
                    bool returnSFW = SetForegroundWindow(x);
                    Console.WriteLine(String.Format("showwindow {0} , setforeground {1}", returnSW, returnSFW));
                    data.hWnd = hwnd;
                    data.hWndPtr = x;
                }
            }

            return true;
        }

Die Fenster werden nun zwar alle angezeigt, aber diese DropDownBox erscheint trotz der Prüfung, ob es sich um ein Fenster handelt.

06.12.2011 - 16:21 Uhr

Ich hab jetzt einiges probiert, aber ich bekomme nicht immer das gewünschte Handle.
Hab ich etwas übersehen?


        public struct SearchData
        {
            public IntPtr hWnd;
        }

        public delegate bool CallBackPtr(int hwnd, ref SearchData data);
        private CallBackPtr callBackPtr;

        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern int EnumWindows(CallBackPtr callBackPtr, ref SearchData data);

        [DllImport("user32.dll", SetLastError = true)]
        static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);

        public bool Report(int hwnd, ref SearchData data)
        {
            Console.WriteLine("Window handle is " + hwnd);
            uint processId = 0;
            GetWindowThreadProcessId((IntPtr)hwnd, out processId);
            if (processId == Int32.Parse(GetCurrentProcessId()))
            {
                data.hWnd = (IntPtr)hwnd;
                return false;
            }

            return true;
        }

        public IntPtr SearchForWindow()
        {
            SearchData sd = new SearchData();

            EnumWindows(new CallBackPtr(this.Report), ref sd);
            return sd.hWnd;
        }

06.12.2011 - 15:00 Uhr

Hi, danke für den Tipp.
So wie ich das verstanden habe, liefert mir EnumWindows alle Handles aller Forms/Controls zurück richtig?
In dem Beispiel auf EnumWindows wird ein bestimmtes Handle nach Klassenname und Fenstertitel gesucht. Ich würde mich jedoch gerne nur auf die Process-Id beschränken und unabhängig von Namensänderungen sein. Ist das möglich?

06.12.2011 - 12:17 Uhr

Hallo,

ich habe bereits erfolgreich in diesem Forum gelesen, wie man externe Forms über Win32 ansprechen kann. Dies kann ich zum Teil auch prima in meiner Anwendung nutzen. Dort kann ich beliebig viele externe Anwendungen/Processe starten. In einer Liste halte ich neben Anwendungsdaten auch die Pocess-Id vor. Durch diese kann ich jedes Form, welches ich in meiner Liste anklicke wieder in den Vordergrund holen.

Das mache ich so:


 // Handle des selektierten PRozesses ermitteln
IntPtr handle = Process.GetProcessById(Int32.Parse(GetCurrentProcessId())).MainWindowHandle;

// Form wiederherstellen
ShowWindow(handle.ToInt32(), SW_RESTORE);

// Form in den Vordergrund
SetForegroundWindow(handle);

Wie bereits erwähnt funktioniert es so.

Nun ist allerdings die Vorgabe, dass die Fenster nicht mehr in der Taskbar angezeigt werden sollen. Also setze ich das Flag ShowInTaskBar = false.

Das Problem ist nun, dass ich kein MainWindowHandle mehr bekomme bzw. es ist 0 und die Forms sich nicht mehr steuern lassen.

Kann mir jemand helfen?

30.11.2011 - 17:04 Uhr

Hallo,

ich möchte in meiner Anwendung bestimmte Ereignisse in eine Log-Datei schreiben. In diese Datei wird aus mehreren Threads geschrieben. Hierzu habe ich anhand eines Beispiels einen Logger erstellt, welcher als Singleton umgesetzt ist.

Auszug:


 private static LogWriter _logWriterSingleton;
static readonly object _threadLock = new object();

public static LogWriter LogTracer
        {
            get
            {
                if (_logWriterSingleton == null)
                {
                    // Threadsafe
                    lock (_threadLock)
                    {
                        if (_logWriterSingleton == null)
                        {
                            _logWriterSingleton = new LogWriter();
                        }
                    }
                }
                return _logWriterSingleton;
            }
        }

In diesem Logwriter habe ich nun eine Methode WriteMessage, welche in eine Datei mittels File.AppendAllText() schreibt.

Ein Aufruf sieht z.B. so aus:

LogWriter.LogTracer.WriteMessage(Logmessage, MethodBase.GetCurrentMethod().Module.Name, MethodBase.GetCurrentMethod().Name, Messagetyp);

Mein Problem ist nun, dass ich ab und an einen Fehler erhalte, dass die Datei bereits von einem anderen Prozess verwendet wird.
Ich habe hier folgende Themen gefunden, welche mir allerdings nicht weiterhelfen konnten.
Der Prozess kann nicht auf die Datei .. zugreifen, da sie von einem anderen Prozess verwendet wird und Threadsicher in Datei schreiben

Im zweiten Thema wird die Write-Methode mit 'lock' aufgerufen ... bei mir wird das 'lock' beim Ermitteln der Instanz genutzt. Macht das einen großen Unterschied?
Eigentlich hatte ich gedacht, dass ein Thread wartet bis der schreibende Thread fertig ist, oder?

01.11.2011 - 07:49 Uhr

Ich habe noch einen 'Beschleunigungsfaktor' nach langer Suche im Netz gefunden.
Es ist wohl besser neue DataGridViewRows mit der Methode AddCopies() hinzuzufügen.
Man erstellt zuerst mit der Methode Add() eine 'Musterzeile' und erstellt mit AddCopies() die benötigte Anzahl von Zeilen auf Grundlage der ersten Zeile.

31.10.2011 - 13:21 Uhr

Ich hab's:

e.Value = this.table.DefaultView[e.RowIndex][e.ColumnIndex];

Jetzt läuft alles schön flott 😁

31.10.2011 - 11:26 Uhr

Ich hab den Übeltäter gefunden. Ich habe für das Grid immer auf table.DefaultView.ToTable() gesetzt, wenn ich Daten haben wollte. Das hat stark ausgebremst.
Flackern habe ich zusätzlich wie folgt umgangen:

this.SetStyle(ControlStyles.DoubleBuffer | ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint, true);
            this.UpdateStyles();

Meine Absicht war es, dass das Grid immer nur gefilterte Daten anzeigt. Diese sind ja in der DefaultView enthalten. Wie kann ich am besten die gefilterten Daten der View im CellValueNeeded-Event anzeigen?

31.10.2011 - 09:48 Uhr

Hallo Bernd,

ich wollte schon beim DataGridView bleiben, da es vom Sortieren und Filtern her einfacher zu händeln scheint.

ich habe nun im Konstruktor folgende Zeilen ergänzt. Aber auch das bringt keine Besserung:

this.dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
            this.dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None;
            this.dataGridView1.AutoSize = false;
31.10.2011 - 09:31 Uhr

Ich setze in der DefaultView der Datatable den RowFilter und dann füge ich entsprechend des gefilterten Ergebnisses Rows in das DataGridView ein. Das ist doch das was Du meinst oder?

31.10.2011 - 09:18 Uhr

Hallo,

ich habe für mein Hauptprojekt ein kleines Testprojekt erstellt, in dem ich testen wollte, wie performant das Darstellen von großen Datenmengen im DataGridView ist. Ich habe bereits im Forum gelesen, dass der VirtualMode dafür gedacht ist und die Daten über das CellValueNedded-Event angefordert werden. Das DataGridView soll readonly sein und auch filterbar. Die Daten entnehme ich der DefaultView einer DataTable und setze dort entsprechend den RowFilter... klappt alles ganz gut. Aber die Testanwendung ist echt träge (CPU 25%). Könnt Ihr mir sagen, wie ich die Sache beschleunigen kann?

Eigenschaften DataGridView:
ColumnHeadersHeigt=AutoSize
ColumnHeadersVisible = true
RowHeadersVisible=false
SelectionMode=FullRowSelect
AllowUserToAddRows=false
AllowUserToDeleteRows=false

Hier der Code aus der TestApp:

using System;
using System.Data;
using System.Threading;
using System.Windows.Forms;

namespace Testprojekt
{
    public partial class Form1 : Form
    {
        DataTable table = new DataTable("TestTable");
        private Thread main;
        private  delegate void VoidDelegate();


        private string _nameFilter = string.Empty;

        public Form1()
        {
            InitializeComponent();
            ThreadStart start = new ThreadStart(ThreadMethod);
            main = new Thread(start);
            main.IsBackground = true;

            // erzeuge Datatable
            this.ConfigureDataTable();

            // konfiguriere Grid
            this.ConfigureGrid();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            this._nameFilter = this.textBox1.Text;

            this.button1.Enabled = false;

            this.main.Start();

            this.button2.Enabled = true;
            this.button3.Enabled = true;
        }

        private void ThreadMethod()
        {
            // erzeuge Daten für Grid in DataTable
            this.AddDataTableRows();

            // Table filtern
            BeginInvoke(new VoidDelegate(FilterTableView));


            // schreibe Daten in das Grid bzw. füge Zeile hinzu
            // Daten werden mittels CellValueNeede geladen
            BeginInvoke(new VoidDelegate(AddTableRowsToGrid));
        }

        /// <summary>
        /// Fügt Zeilen entsprechend der Defaultview in das DataGridView ein
        /// </summary>
        private void AddTableRowsToGrid()
        {
            if (this.table == null) return;
            if (this.dataGridView1 == null) return;
            if (this.dataGridView1.Columns.Count != 3) return;

            this.dataGridView1.Rows.Clear();

            foreach (DataRow dataRow in this.table.DefaultView.ToTable().Rows)
            {
                this.dataGridView1.Rows.Add();
            }
        }

        /// <summary>
        /// Setzt Filterklausel für Defaultview fest
        /// </summary>
        private void FilterTableView()
        {
            if (!String.IsNullOrEmpty(this._nameFilter))
            {
                this.table.DefaultView.RowFilter = string.Format("Name LIKE '%{0}%'", this._nameFilter);
            }
            else
            {
                this.table.DefaultView.RowFilter = string.Empty;
            }
            this.AddTableRowsToGrid();
        }

        /// <summary>
        /// Fordert anzuzeigende Werte ab
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void dataGridView1_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e)
        {
            if (this.table == null) return;
            if (this.table.DefaultView == null) return;
            if (this.table.DefaultView.ToTable().Rows.Count == 0) return;

            e.Value = this.table.DefaultView.ToTable().Rows[e.RowIndex][e.ColumnIndex];
        }

        /// <summary>
        /// Fügt dem DataGridView Spalten hinzu
        /// </summary>
        private void ConfigureGrid()
        {
            if (this.dataGridView1 == null) return;
            this.dataGridView1.Columns.Clear();

            try
            {
                this.dataGridView1.Columns.Add("ID", "Id");
                this.dataGridView1.Columns.Add("Netto", "Netto");
                this.dataGridView1.Columns.Add("Brutto", "Brutto");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, @"Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        /// <summary>
        /// Fügt der DataTable 3 Spalten hinzu
        /// </summary>
        private void ConfigureDataTable()
        {
            if (this.table == null) return;

            try
            {
                this.table.Columns.Add("Id", Type.GetType("System.Int32"));
                this.table.Columns.Add("Netto", Type.GetType("System.Int32"));
                this.table.Columns.Add("Brutto", Type.GetType("System.Double"));
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, @"Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        /// <summary>
        /// Fügt der DataTable Zeilen hinzu
        /// </summary>
        private void AddDataTableRows()
        {
            if (this.table == null) return;
            if (this.table.Columns.Count == 0)
            {
                MessageBox.Show(@"Es befinden sich keine Spalten im Grid.", @"Fehler", MessageBoxButtons.OK,
                                MessageBoxIcon.Error);
                return;
            }

            DataRow dr1;

            for (int i = 0; i <= 100000; i++)
            {
                dr1 = table.NewRow();
                dr1["Id"] = i;

                dr1["Netto"] = i*2;
                dr1["Brutto"] = i * 2*1.19f;
                this.table.Rows.Add(dr1);
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            this.button1.Enabled = true;
            this.button2.Enabled = false;

            this.dataGridView1.Rows.Clear();
            this.table.Rows.Clear();

            this.textBox1.Text = string.Empty;
        }

        private void button3_Click(object sender, EventArgs e)
        {
            this._nameFilter = this.textBox1.Text;

            this.FilterTableView();
        }


    }
}

18.10.2011 - 07:41 Uhr

Danke für den Tip. Das Fenster wird ohne Owner angezeigt. Ich habe es nun so umgesetzt, dass wenn das Parent minimiert wird, schicke ich eine Message 'Restore' an das Child. Klappt ganz gut.

10.10.2011 - 11:57 Uhr

Hallo,

ich habe ein Formular mit einem UserControl, in welchem ich ein neues Formular erzeuge und anzeige. Ich möchte, dass sich das Parent minimiert und das Child so bleibt, wie es ist (kein MDI).
Ich feuer dazu im UserControl ein Event, auf das ich im Parent reagieren und den FormWindowState auf Minimized setze. Dabei minimieren sich aber alle Forms.

Wie kann ich das Problem umgehen? ICh habe auch probiert, dem Child beim Show() nen anderen Owner zu geben, aber das hat auch nicht funktioniert.