Laden...
H
hypersurf myCSharp.de - Member
Softwareentwickler Münster Dabei seit 16.10.2008 523 Beiträge
Benutzerbeschreibung

Forenbeiträge von hypersurf Ingesamt 523 Beiträge

01.04.2011 - 14:20 Uhr

Hallo Leute,

ich habe ein ganz seltsames Problem. Innerhalb meines ViewModels habe ich verschiedene Commands. Einige Commands steuern Funktionen der Toolbar und auch ob die Buttons aktiv sind oder nicht.

Mehrere Commands geben im CanExecute True zurück, wenn eine interne ObservableCollection eine gewisse Anzahl von Elementen enthält:


        private ObservableCollection<int> _SelectedElements;
        public ObservableCollection<int> SelectedElements
        {
            get { return _SelectedElements; }
            set { 
                    _SelectedElements = value;
                    this.ValueChanged("SelectedElements");
                }
        }


        private bool Toolbar_Designer_VerbindenCanExecute(object parameter)
        {
            Console.WriteLine(this.SelectedElements.Count);
            return (this.SelectedElements.Count > 1);
        }

        private void Toolbar_Designer_VerbindenExecuted(object parameter)
        {
            ConnectSelectedElements();
        }


<Button Content="blabla" Command="{Binding cmdToolbar_Designer_Verbinden}"/>

Wenn ich ein Element in meiner Maske anklicke wird dieses selektiert und mit einem Rahmen umschlossen. In dem Moment wird auch die Collection gefüllt.


        public void SetSelection(bool pIsSelected, int pElementKey)
        {
            BaseControlElement element = GetElement(pElementKey);

            if (element != null)
            {
                element.IsSelected = pIsSelected;

                if (!pIsSelected)
                {
                    // Selektion aufheben und Key aus der Liste entfernen
                    for (int i = this.SelectedElements.Count - 1; i >= 0; i--)
                    {
                        if (this.SelectedElements[i] == pElementKey) this.SelectedElements.RemoveAt(i);
                    }
                }
                else
                {
                    this.SelectedElements.Add(pElementKey);
                }
            }
        }

Komischerweise wird die CanExecute-Methode nur aufgerufen, wenn ich auf das Fenster klicke, das Fenster in den Hintergrund bringe oder andere tolle Dinge mit dem Fenster mache. Ich verstehe überhaupt nicht warum das nicht funktioniert.

Habt Ihr einen Rat warum das Command nicht richtig funktioniert?

31.03.2011 - 14:43 Uhr

Hallo Leute,

ich programmiere gerade einen grafischen Designer in dem der User Element hinzufügen, verschieben und verbinden kann.

Bei der Verbindung der Elemente wird zwischen den Elementen eine Linie gezeichnet. Am Ende der Linie soll ein Dreieck gezeichnet werden, welches entsprechend des Rotationswinkels der Linie ausgerichtet ist. Wie ein richtiger Pfeil halt.

Kann mir jemand sagen, wie man den Rotationswinkel der gezeichneten Linie anhand der beiden Koordinaten berechnet?

30.03.2011 - 10:59 Uhr

Eine recht einfache wenn auch unschöne Lösung ist über das Loaded-Event des Canvas:


        private void MyCanvas_Loaded(object sender, RoutedEventArgs e)
        {
            _DesignCanvas = sender as Canvas;
        }

Werd's wohl erstmal so lassen, weil ich aus Zeitgründen gerade nicht weiter rumprobieren kann...

29.03.2011 - 13:19 Uhr

Hallo Leute,

ich möchte in einer Anwendung Drag&Drop realisieren, sprich Items innerhalb eines Canvas verschieben.

Dafür habe ich ein entsprechendes ViewModel erstellt, welches eine Collection mit Objekten unterschiedlicher Datentypen enthält. Über einen TemplateSelector wird das entsprechende Datatemplate ausgewählt und in einem ItemsControl dargestellt. Das klappt auch problemlos.

Jetzt kommt der Teil an dem ich gerade total verzweifel: Wie komme ich per C#-Code an das im ItemsPanelTemplate definierte Canvas?


<ItemsControl ItemsSource="{Binding Path=VisualItems}" MouseLeftButtonDown="ItemsControl_MouseLeftButtonDown"
                                                                       MouseLeftButtonUp="ItemsControl_MouseLeftButtonUp"
                                                                       MouseMove="ItemsControl_MouseMove">
                    <ItemsControl.ItemsPanel>
                        <ItemsPanelTemplate>
                            <Canvas AllowDrop="true"
                                    x:Name="MyCanvas"
                                    PreviewMouseLeftButtonDown="MyCanvas_PreviewMouseLeftButtonDown"
                                    PreviewMouseMove="MyCanvas_PreviewMouseMove"
                                    PreviewMouseLeftButtonUp="MyCanvas_PreviewMouseLeftButtonUp"/>
                        </ItemsPanelTemplate>
                    </ItemsControl.ItemsPanel>

                    <ItemsControl.ItemTemplateSelector>
                        <local:ControlTemplateSelector/>
                    </ItemsControl.ItemTemplateSelector>

                    <ItemsControl.ItemContainerStyle>
                        <Style TargetType="{x:Type ContentPresenter}">
                           
                            <Setter Property="Canvas.Left" Value="{Binding Path=X}"/>
                            <Setter Property="Canvas.Top" Value="{Binding Path=Y}"/>
                        </Style>
                    </ItemsControl.ItemContainerStyle>
                </ItemsControl>


    <DataTemplate x:Key="Template_StartStop">
        <Border Background="White"
            BorderThickness="3"
            CornerRadius="10"
            MinWidth="150"
            MinHeight="40" BorderBrush="Black">
            <Label Content="{Binding Path=Bezeichnung, FallbackValue=Start-Stop}" 
               VerticalAlignment="Center"
               HorizontalAlignment="Center"
               FontWeight="Bold"
               FontSize="20"/>
        </Border>
    </DataTemplate>  


        private void ItemsControl_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            ItemsControl contentControl = (ItemsControl)e.Source;
            Canvas cv = (Canvas)contentControl.ItemsPanel.FindName("MyCanvas", contentControl);
        }

In der zweiten Zeile gibt es eine System.InvalidOperationException

Fehlermeldung:
System.InvalidOperationException wurde nicht behandelt.
Message="Dieser Vorgang ist nur gültig für Elemente, auf die diese Vorlage angewendet wird."

Kann mir jemand einen Tip geben, wie ich per C#-Code an das Canvas komme?

18.03.2011 - 13:05 Uhr

Du Bindest ja auch keinen Wert an deine Source. Nach was soll der denn konvertieren?

Es wird das Objekt was per DataContext an das Fenster gebunden ist konvertiert. Man muss nicht zwangsweise nen Path angeben.

Hallo,

Du gibst nen String zurück, das Source Property ist aber ne ImageSource. Da stimmen die Datentypen einfach net. Das du in XAML direkt nen String angeben könntest liegt einfach nur an nem passenden Typekonverter, der wird im Code natürlich nicht automatisch aufgerufen.

Ah okay.. Ich dachte da wird ein String erwartet, weil man das ja auch immer als String im XAML-Code angibt. Mit dem ImageSource funktionierts, danke 🙂

18.03.2011 - 11:06 Uhr

Hallo Leute,

ich habe ein Image dessen Source nicht gebunden ist, ich aber anhand des Objekts welches an den DataContext des Windows gebunden ist die Source des Images ermitteln möchte. Das funktioniert leider nicht (das Bild bleibt leer) und ich bräuchte einen Tip was ich falsch mache:


<Image Source="{Binding Converter={StaticResource SportartConverter}}" Stretch="Fill" Width="25" Height="25"/>


    public class SportartToImageConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (value != null)
            {
                if (value is Fusballspieler) return "Sportarten/Football.ico";
                if (value is Basketballspieler) return "Sportarten/Basketball.ico";
                if (value is Tennisspieler) return new Uri("Sportarten/tennis.gif", UriKind.Relative);
            }
            return "";
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }

Auch wenn ich den Pfad des Bildes direkt als string wiedergebe funktioniert es nicht. In die Convert-Methode reinspringen tut er aber.

08.02.2011 - 09:08 Uhr

Funktioniert leider auch nicht. Vielleicht funktioniert das ja mit dem 4er Framework. Ich arbeite hier mit dem 3.5er.

07.02.2011 - 11:53 Uhr

Ich setze die Styles jetzt erstmal explizit, vielleicht hat jemand noch eine Idee 🙂

Danke an alle die sich durch meinen Beitrag wühlen 8)

07.02.2011 - 11:43 Uhr

Das funktioniert aber auch nicht:


    <Style TargetType="my.system.wpf:my_UserControl">
        <Setter Property="Background" Value="{Binding Path=Style.UserControl.BackColor}"/>
    </Style>

Das ist doch im Prinzip auch dasselbe wie das was ich bereits hatte, denn der implizite Style für mein abgeleitetes UserControl (my_UserControl) basiert ja auf dem Style der die Werte enthält:


    <Style TargetType="UserControl" x:Key="my_style_usercontrol">
        <Setter Property="Background" Value="{Binding Path=Style.UserControl.BackColor}"/>
    </Style>
    
    <Style TargetType="my.system.wpf:my_UserControl" BasedOn="{StaticResource my_style_usercontrol}"/>

07.02.2011 - 11:26 Uhr

Hallo Leute,

ich habe ein UserControl (my_UserControl) von der Klasse UserControl abgeleitet und möchte den Style für alle UserControls dieses Typs vorgeben.

Das scheint, ohne dem UserControl den Style direkt zuzuweisen, aber nicht zu funktionieren. Der Style sowie das UserControl liegen sind in einer DLL abgelegt.

Style aus der DLL:


<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:my.system.wpf="clr-namespace:my.System.WPF">

    <Style TargetType="UserControl" x:Key="my_style_usercontrol">
        <Setter Property="Background" Value="{Binding Path=Style.UserControl.BackColor}"/>
    </Style>
    
    <Style TargetType="my.system.wpf:my_UserControl" BasedOn="{StaticResource my_style_usercontrol}"/>
</ResourceDictionary>

Das abgeleitete UserControl:


<my.system.wpf:my_UserControl x:Class="my_UserControl"
    xmlns:my.system.wpf="clr-namespace:my.System.WPF"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Height="300" Width="300">
    <Grid>

    </Grid>
</my.system.wpf:my_UserControl>

App.xaml der Anwendung:


            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="pack://application:,,,/my.System.WPF;Component/Styles/TextBoxStyle.xaml"/>
                <ResourceDictionary Source="pack://application:,,,/my.System.WPF;Component/Styles/UserControlStyle.xaml"/>
            </ResourceDictionary.MergedDictionaries>


<my.system.wpf:my_UserControl x:Class="Kapazitätsplanung.ViewKapaAnzeige"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation"
    xmlns:telerikQuickStart="clr-namespace:Telerik.Windows.Controls.QuickStart;assembly=Telerik.Windows.Controls"
    xmlns:my.system.wpf="clr-namespace:my.System.WPF;assembly=my.System.WPF">

Warum funktioniert dass ganze nicht? Wenn ich den Style explizit dem UserControl zuweise (

 Style="{DynamicResource my_style_usercontrol}"

) funktioniert es direkt.

Warum funktioniert der Style nur wenn ich ihn explizit zuweisen? Habe ich einen Denkfehler?

Wäre super dankbar für einen Tip 🙂

04.02.2011 - 12:06 Uhr

Ja, die Anwendung funktioniert tadellos. Scheint wohl mal wieder ein Bug vom Designer zu sein... 😭

04.02.2011 - 11:54 Uhr

Ich habe das Problem jetzt mittels eines Controlpresenters gelöst und verwende anstatt Pages jetzt UserControls.


    <Window.Resources>
        <DataTemplate DataType="{x:Type local:KapaAnzeigeViewModel}">
            <local:ViewKapaAnzeige/>
        </DataTemplate>
        <DataTemplate DataType="{x:Type local:UnverplantFilterViewModel}">
            <local:ViewUnverplantFilter/>
        </DataTemplate>
    </Window.Resources>


            <ContentPresenter Name="MyContent" Grid.Column="2" Grid.Row="0" 
                              Content="{Binding Path=CurrentContent}"/>

Das ViewModel des Hauptfensters enhält eine Eigenschaft CurrentContent die vom Typ der Basisklasse meiner ViewModels ist:


        private BaseViewModel _CurrentContent;
        public BaseViewModel CurrentContent
        {
            get { return _CurrentContent; }
            set { 
                    _CurrentContent = value;
                    ValueChanged("CurrentContent");
                }
        }


KapaAnzeigeViewModel model = new KapaAnzeigeViewModel();
this.CurrentContent = model;

So funktioniert das ganze wie ich es mir vorgestellt habe.

Jetzt habe ich nur noch ein sehr merkwürdiges Problem mit dem Visual Studio 2008. Der WPF-Designer in dem die Vorschau des Fensters angezeigt wird zeigt immer einen "Fehler beim Laden" an. Dieser kommt anscheinend von den DataTemplates. Kompiliert wird zwar mit 0 Fehlern und 0 Warnungen, eine Fehlermeldung erhalte ich aber trotzdem:

Fehlermeldung:
Fehler 1 Die Instanz des ViewKapaAnzeige-Typs konnte nicht erstellt werden.

Kommentiere ich die Datatemplates aus, funktioniert die Vorschau wieder 🤔

03.02.2011 - 15:01 Uhr

Hallo Leute,

in meiner Anwendung gibt es ein Hauptfenster mit einem Bereich (Frame) in dem verschiedene Pages dargestellt werden sollen. Das Hauptfenster ist ein ViewModel, die Pages auch.

Da bisher nur die Oberfläche grob designed wurde, habe ich zur Navigation einfach die Source-Eigenschaft des Frames an das ViewModel gebunden.

Source="{Binding Path=CurrentFramepage}"

Das klappt natürlich, bringt mir aber im MVVM-Pattern nichts, weil ich Daten an die ViewModels der Pages weitergeben muss. Ich bräuchte einen kleinen Denkanstoß wie kann man sowas im MVVM realisieren kann. Mr. Google konnte mir nicht wirklich helfen.

Ich hatte schonmal versucht die DataContext-Eigenschaft des Frames mit der Page zu füttern, das klappt aber nicht (es wird gar nichts dargestellt).

28.01.2011 - 12:31 Uhr

Hallo,

gestalte den Converter einfach so um, dass er direkt mit dem Alter arbeitet statt der Adresse. Dann kannst du das Foreground Property direkt gegen Alter binden so wie den Text, und dann wird das Binding auch bei Änderung des Alters aktualisiert.

@zero_x
Das ist hier nicht das Problem 🙂

Danke sehr, so funktioniert es 🙂


            <TextBox x:Name="txtAlter" Grid.Column="3" Grid.Row="5"
                     Text="{Binding Path=Alter, ValidatesOnDataErrors=True, 
                            NotifyOnValidationError=True, Converter={StaticResource IntConverter}}"
                     Foreground="{Binding Path=Alter, Converter={StaticResource AlterConverter}}"/>

28.01.2011 - 12:06 Uhr

Hallo Leute,

ich habe eine simple Anwendung mit fünf Textfeldern und einer kleinen Klasse (Adresse) dahinter. Unter anderem kann ein Alter eingegeben werden. Ich möchte, dass sich je nach Alter die ForegroundColor der Alter-Textbox ändert.

Das habe ich über einen Converter realisiert:


public class AlterToBrushConverter : IValueConverter
     {
        private Brush _FarbeJung = Brushes.Green;
        public Brush FarbeJung
        {
            get { return _FarbeJung; }
            set { _FarbeJung = value; }
        }

        private Brush _FarbeAlt = Brushes.Red;
        public Brush FarbeAlt
        {
            get { return _FarbeAlt; }
            set { _FarbeAlt = value; }
        }

        private int _Altersgrenze = 60;
        public int Altersgrenze
        {
            get { return _Altersgrenze; }
            set { _Altersgrenze = value; }
        }


        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (value != null)
            {
                Adresse adresse = (Adresse)value;

                if (adresse.Alter < this.Altersgrenze)
                {
                    return this.FarbeJung;
                }
                else
                {
                    return this.FarbeAlt;
                }
            }
            return Brushes.Black;
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }


    <Window.Resources>
        <local:IntToStringConverter x:Key="IntConverter"/>
        <local:AlterToBrushConverter x:Key="AlterConverter" Altersgrenze="60" 
                                     FarbeAlt="Red" FarbeJung="Green"/>
    </Window.Resources>


           <TextBox x:Name="txtAlter" Grid.Column="3" Grid.Row="5"
                     Text="{Binding Path=Alter, ValidatesOnDataErrors=True, 
                            NotifyOnValidationError=True, Converter={StaticResource IntConverter}}"
                     Foreground="{Binding Converter={StaticResource AlterConverter}}"/>

Der Converter wird nur einmal (beim Programmstart) durchlaufen. Wie bekomme ich es hin, dass der AlterConverter bei jeder Änderung der Text-Eigenschaft aufgerufen wird?

26.01.2011 - 15:17 Uhr

Mit Binding klappt's auch nicht:


                            <ia:Interaction.Triggers>
                                <ia:EventTrigger EventName="MouseLeftButtonDown">
                                    <ia:InvokeCommandAction CommandName="{Binding cmdNavigateFrame}"/>
                                </ia:EventTrigger>
                            </ia:Interaction.Triggers>

"Binding" kann nicht für die Eigenschaft "CommandName" vom Typ "InvokeCommandAction" festgelegt werden. "Binding" kann nur für eine "DependencyProperty" eines "DependencyObject" festgelegt werden.

zu Interaction.Triggers kannst du keine EventTrigger hinzufügen

Mit dem 4er Framework und dem Blend SDK 4 funktioniert das. Leider muss ich mit dem 3.5er Framework vorlieb nehmen, da Visual Studio 2008 ja kein 4er Framework unterstützt...

26.01.2011 - 14:19 Uhr

Hallo Leute,

ich setze gerade ein Projekt mittels des MVVM-Pattern um. Wir benutzen unter anderem die telerik-Controls, die die Command-Eigenschaft leider nicht vollständig implementiert haben. Daher möchte ich mir mit der System.Windows.Interactivity behelfen (Framework 3.5) um so den Mausklick zu triggern.

Mein code sieht wie folgt aus:


                        <telerik:RadPanelBarItem>
                            <ia:Interaction.Triggers>
                                <ia:EventTrigger EventName="MouseLeftButtonDown">
                                    <ia:InvokeCommandAction CommandName="cmdNavigateFrame"/>
                                </ia:EventTrigger>
                            </ia:Interaction.Triggers>
                            
                            <telerik:RadPanelBarItem.Header>
                                <StackPanel Orientation="Horizontal" Margin="10 4 5 5">
                                    <Image Source="Images/suchen.png"></Image>
                                    <Label Content="Anzeigen/Bearbeiten"/>
                                </StackPanel>
                            </telerik:RadPanelBarItem.Header>
                        </telerik:RadPanelBarItem>

Beim Starten des Projekts erhalte ich folgende Fehlermeldung:

Einem Objekt vom Typ "System.Windows.Interactivity.TriggerCollection" kann kein Inhalt vom Typ "System.Windows.Interactivity.EventTrigger" hinzugefügt werden. Fehler in Objekt "System.Windows.Interactivity.EventTrigger" in Markupdatei "Projekt;component/mainwindow.xaml", Zeile 51, Position 35.

Könnt Ihr mir einen Tip geben was ich falsch mache? Google spuckt leider weder auf Deutsch noch auf Englisch etwas hilfreiches zu dieser Fehlermeldung aus.

18.01.2011 - 12:17 Uhr

Hi Leute,

ich habe eine Frage zum MVVM-Pattern.

Jede Textbox die den Focus erhält, bekommt eine andere Hintergrundfarbe (gelb). Wechselt der Focus bekommt die Textbox wieder eine andere Hintergrundfarbe (weiss).

Dazu habe ich einen Style im View definiert und die Value-Eigenschaft an eine Property in meinem ViewModel gebunden:


    <Window.Resources>
        <Style TargetType="TextBox">
            <Style.Triggers>
                <Trigger Property="IsFocused" Value="True">
                    <Setter Property="Background" Value="{Binding Path=BackgroundColorTextBoxGotFocus}"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </Window.Resources>


        public Brush BackgroundColorTextBoxGotFocus
        {
            get { return _GlobalConfig.TextboxBackColorWithFocus; }
            set
            {
                _GlobalConfig.TextboxBackColorWithFocus = value;
                ValueChanged("BackgroundColorTextBoxGotFocus");
            }
        }

Das funktioniert soweit auch ohne Probleme. Jetzt zu meiner Frage: Der Style soll für alle Views gelten und die Farben sollen aus einer Datenbank gelesen werden. Dafür habe ich bereits eine Klasse geschrieben, die entsprechende Properties bereitstellt. Wie umgehe ich es, dass ich in jedem ViewModel die Property für das DataBinding der Farben neu definieren muss?

Und noch eine Frage: Wo definiere ich den Style, dessen Setter.Values aus der Datenbank gelesen werden sollen? Das Loginfenster der Datenbank ist natürlich auch nach MVVM entwickelt, und die Datenbankverbindung steht somit erst nach erfolgreichem Anmelden mittels Loginfenster zur Verfügung.

17.01.2011 - 09:31 Uhr

Danke für Eure schnellen Antworten, werde mich gleich mal an die Arbeit machen 😃

Hallo zero_x,
denke ich immer noch das hier das Behaviour unnötig ist.

Da hast Du recht, aber mir geht es auch darum das Arbeiten mit den Behaviours zu lernen 😉

14.01.2011 - 14:23 Uhr

Ich benutze das MVVM-Pattern und habe in meinem View mehrere Textboxen. Die Textbox die den Focus hat soll eine andere Hintergrundfarbe bekommen also die anderen Textboxen. Das funktioniert über Commands die mittels Trigger ausgelöst werden auch recht problemlos:

<TextBox>
	<i:Interaction.Triggers>
        	<i:EventTrigger EventName="GotFocus">
                	<wpf:CommandAction Command="{Binding cmdTextboxGotFocus}"/>	
		</i:EventTrigger>
                <i:EventTrigger EventName="LostFocus">
                        <wpf:CommandAction Command="{Binding cmdTextboxLostFocus}"/>	
		</i:EventTrigger>	
	</i:Interaction.Triggers>
</TextBox>

Ich möchte aber nicht bei jeder Textbox die Trigger hinterlegen, sondern würde das gerne über ein Template lösen:

    <Window.Resources>
        <ControlTemplate x:Key="myTextBox" TargetType="TextBox">
            <TextBox>
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="GotFocus">
                        <wpf:CommandAction Command="{Binding cmdTextboxGotFocus}"/>
                    </i:EventTrigger>
                    <i:EventTrigger EventName="LostFocus">
                        <wpf:CommandAction Command="{Binding cmdTextboxLostFocus}"/>
                    </i:EventTrigger>
                </i:Interaction.Triggers>
            </TextBox>
        </ControlTemplate>
    </Window.Resources>

Auch das funktioniert ohne Probleme, sofern ich allen Textboxen das Template zuweise. Danach funktioniert aber das Databinding nicht mehr.

                    <TextBox Grid.Column="3" Grid.Row="0" Height="20" 
                             Text="{Binding Path=Databasename}" Template="{StaticResource myTextBox}">
                    </TextBox>

Könnt Ihr mir einen Hinweis geben, warum das Binding bei zugewiesenem Template nicht mehr funktioniert? Nehme ich das Template wieder raus, funktioniert das Binding wieder einwandfrei.

Danke =)

06.12.2010 - 11:51 Uhr

Falls es jemanden interessiert, ich habe das Problem jetzt wie folgt gelöst:

Ich öffne per Hotkey eine Transparente Form auf der der User einen Rahmen (=Picturebox) aufziehen kann. Mit der Screenshotklasse von dieser Seite erstelle ich dann für den Bereich der Picturebox einen Screenshot. Anschließend nutze ich die ABBY Finereader Engine, die wir hier im Hause auch für andere Produkte einsetzen, um den Text zu erkennen.

05.12.2010 - 17:53 Uhr

Eine Idee wäre evtl. noch einfach STRG+C an die entsprechende Anwendung zu senden. Dann könnte man das ganze über die Zwischenablage realisieren. Ist zwar nicht toll, aber relativ zweckdienlich...

04.12.2010 - 16:25 Uhr

Okay, d. h. man müsste eigentlich für Browser ein Browserplugin schreiben.

Alternative gäbe es auch noch die Möglichkeit, den User einen Rahmen aufziehen zu lassen, einen kleinen Screenshot zu machen und dann per OCR den Text zu erkennen. Ähnlich macht es wohl auch Babylon....

03.12.2010 - 13:36 Uhr

Zum Beispiel soll damit eine Integration einer Finanzbuchhaltung geschaffen werden. D. h. stehe ich in der Finanzbuchhaltungsoftware im Feld Debitoren-Nr. soll auf Tastendruck der Kundenstamm der ERP-Software mit der entsprechenden Kundennummer geöffnet werden (Debitor = Kunde).

Bei Browsern/Webseiten innerhalb von Browsern haben die Steuerelemente anscheinend keine eigenen Handles, was das ganze recht problematisch macht, da einige Anwendungen bereits im Browser laufen.

03.12.2010 - 11:04 Uhr

Hi Leute,

ich bin nicht ganz sicher, ob das möglich ist was ich möchte, da ich nach ewigem googlen und durchforsten der APIs keine Lösung gefunden habe.

Anforderung an mein Programm:

Das Programm läuft im Hintergrund. Wird ein bestimmter Hotkey gedrückt soll der Wert des Feldes was aktuell den Fokus hat (bestimmter anderer Anwendungen) verarbeitet werden. Um die Verarbeitung deutlich zu erleichtern, wäre es super wenn ich den Feldnamen des aktiven Controls ermitteln könnte.

Das Handle des aktuellen Controls ermittle ich mit GetFocus(). Anschließend lese ich per SendMessage den Text aus dem Control aus.
Mittels GetClassInfo wollte ich dann den Controlnamen auslesen. Ich bekomme die Implementierung von GetClassInfo aber nicht hin:

So sieht meine Deklaration aus:


        delegate IntPtr WndProc(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);

        [System.Runtime.InteropServices.StructLayout(
            System.Runtime.InteropServices.LayoutKind.Sequential,
           CharSet = System.Runtime.InteropServices.CharSet.Unicode
        )]
        struct WNDCLASS
        {
            public uint style;
            public WndProc lpfnWndProc;
            public int cbClsExtra;
            public int cbWndExtra;
            public IntPtr hInstance;
            public IntPtr hIcon;
            public IntPtr hCursor;
            public IntPtr hbrBackground;
            [System.Runtime.InteropServices.MarshalAs (System.Runtime.InteropServices.UnmanagedType.LPWStr)]
            public string lpszMenuName;
            [System.Runtime.InteropServices.MarshalAs (System.Runtime.InteropServices.UnmanagedType.LPWStr)]
            public string lpszClassName;
        }

        [System.Runtime.InteropServices.DllImport("user32.dll", SetLastError = true)]
        static extern System.IntPtr DefWindowProcW(
            IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam
        );

So rufe ich GetClassInfo auf:


WNDCLASS wndclass = new WNDCLASS();
wndclass.lpfnWndProc = new WndProc(CustomWndProc);
strBuffer = new StringBuilder();
strBuffer.Capacity = 255;
GetClassInfo(focus.ToInt32(), this.Classname, ref wndclass);


        private static IntPtr CustomWndProc(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam)
        {
            return DefWindowProcW(hWnd, msg, wParam, lParam);
        }

Beim Aufruf der GetClassInfo bekomme ich eine InvalidFunctionPointerInDelegate-Exception, verstehe aber nicht warum. Habt Ihr eine Idee woran das liegen könnte?

Dann habe ich noch eine Frage, bei der Ihr mir vielleicht einen Tip geben könnt.
Mit folgender Methode lese ich den Text des fremden Controls aus:


public void GetCurrentControldata(IntPtr pHandle)
        {
            uint windowThreadProcessId = GetWindowThreadProcessId(GetForegroundWindow(), IntPtr.Zero);
            uint idAttach = GetWindowThreadProcessId(pHandle, IntPtr.Zero);
            if (AttachThreadInput(idAttach, windowThreadProcessId, true))
            {
                IntPtr focus = GetFocus();
                if (focus != IntPtr.Zero)
                {
                    int lngLength = SendMessage(focus, WM_GETTEXTLENGTH, IntPtr.Zero, IntPtr.Zero);
                    StringBuilder strBuffer = new StringBuilder();
                    strBuffer.Capacity = lngLength + 1;

                    int lngRet;
                    lngRet = SendMessage(focus, WM_GETTEXT, strBuffer.Capacity, strBuffer);
                    if (lngRet > 0)
                    {
                        this.Inhalt = strBuffer.ToString().Substring(0, lngRet);
                    }

                    strBuffer = new StringBuilder();
                    strBuffer.Capacity = 255;
                    GetClassName(focus, strBuffer, strBuffer.Capacity);
                    this.Classname = strBuffer.ToString();

                }
                AttachThreadInput(idAttach, windowThreadProcessId, false);
            }
        }

Das klappt auch, aber leider nicht bei allen Steuerelementen. Z. B. funktioniert das Auslesen des Feldwertes nicht bei Input-Feldern innerhalb einer Webseite. Der Classname kommt zwar, der Inhalt bleibt aber leer. Habt Ihr einen Tip für mich, was ich falsch mache bzw. was an meiner Vorgehensweise falsch ist?

24.11.2010 - 14:38 Uhr

Okay, danke verstanden.


?_viewPersonen.GetType().ToString()
   "System.Windows.Data.ListCollectionView"

24.11.2010 - 13:39 Uhr

Hallo Leute,

ich habe eine WPF-Anwendung ich der ich eine ObservableCollection an ein ICollectionView binde.


private ObservableCollection<ViewModelPerson> _Personen;
private ICollectionView _PersDefaultView;

_Personen = new ObservableCollection<ViewModelPerson>();
_PersDefaultView = CollectionViewSource.GetDefaultView(_Personen);

Das funktioniert soweit auch ohne Probleme. Ich habe mir das aus der MSDN angeeignet. Ich verstehe aber die Umsetzung nicht ganz, denn wieso kann ich eine Instanz aus einem Interface erzeugen und plötzlich Funktionalität hinter den Methoden haben? Ein Interface ist doch nur eine Sammlung Methoden die keinerlei Quellcode/Implementierung enthalten. Das machen die Methoden der ICollectionView auch nicht, kann man ja mittels Methodendefinition nachgucken.

Warum kann ich die Methoden wie MoveCurrentToNext usw. bei dieser Art der Deklaration überhaupt benutzen? Woher kommt die Implementierung/Funktionalität der Methoden?

16.11.2010 - 13:49 Uhr

Okay, kapiert 😉

Das mir die Grundlagen fehlen stimmt im übrigen nicht, ich wollte damit nur ausdrücken dass ich nach x-Stunden Fehlersuche nicht mehr richtig durchblicke. Naja, genaue Formulierung ftw 😉

15.11.2010 - 11:10 Uhr

Danke für Eure Antworten 🙂

Bitte beachte auch
>
Punkt 4.c

4c. Wälzt nicht eure Aufgaben auf uns ab

Wundert euch nicht, wenn es zum Teil sehr heftige Gegenreaktionen gibt, falls ihr doch nach fertigen Lösungen fragt oder anderweitig der Eindruck entsteht, dass ihr uns kostenlos für eure Aufgaben einspannen wollt.

Wie soll ich das denn bitte verstehen? Darf ich eine einfache Frage zu der ich selber nach stundenlangem probieren und googlen keine Lösung gefunden habe hier nicht stellen?

Meine Hoffnung war, dass jemand den Code sieht und ihm evtl. direkt auffällt was falsch ist. Ich hab' nicht verlangt dass das irgendwer nach programmiert und versucht in stundenlanger Arbeit mein Problem zu lösen....

12.11.2010 - 11:51 Uhr

Hi Leute,

irgendwie blicke ich durch's Binding noch nicht ganz durch und finde auch nach 2 Std. googlen keine Lösung.

Ich möchte eine simple Validierung implementieren. Die Textfelder dürfen nicht leer sein. D. h. verlässt der User das Textfeld soll ein entsprechendes Controltemplate mit Tooltip angezeigt werden.


        <ControlTemplate x:Key="TextBoxErrorTemplate">
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition/>
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition/>
                    <ColumnDefinition Width="2"/>
                    <ColumnDefinition/>
                </Grid.ColumnDefinitions>
                
                <Border Grid.Column="0" BorderThickness="2" BorderBrush="Red">
                    <AdornedElementPlaceholder Name="Adorner1"/>
                </Border>
                <Image Source="Images/cancel.png" Height="16" Width="16" 
                       Grid.Column="2" 
                       ToolTip="{Binding ElementName=Adorner1, 
                                 Path=AdornedElement.(Validation.Errors)[0].ErrorContent}"/>
            </Grid>
        </ControlTemplate>


    public class VR_Pflichtfeld : ValidationRule
    {
        private string _errorMessage;
        public string ErrorMessage
        {
          get { return _errorMessage; }
          set { _errorMessage = value; }
        }

        public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
        {
            if (value != null && value is string)
            {
                if (((string)value).Length == 0)
                {
                    return new ValidationResult(false, _errorMessage);
                }
                else
                {
                    return new ValidationResult(true, null);
                }
            }
            return new ValidationResult(true, null);
        }
    }


                    <TextBox Grid.Column="3" Grid.Row="0" Height="20" 
                             x:Name="txtDatenbankname" GotFocus="txtDatenbankname_GotFocus"
                             Validation.ErrorTemplate="{StaticResource TextBoxErrorTemplate}">

                        <TextBox.Text>
                            <Binding Path="txtDatenbankname" UpdateSourceTrigger="LostFocus">
                                <Binding.ValidationRules>
                                    <local:VR_Pflichtfeld ErrorMessage="Bitte geben Sie eine Datenbank an!"/>
                                </Binding.ValidationRules>
                            </Binding>
                        </TextBox.Text>
                    </TextBox>

Ich vermute, dass das nur am Binding liegt, sehe aber den Wald vor lauter Bäumen nicht mehr. Habe schon 47 Varianten versucht 🙁

06.10.2010 - 10:24 Uhr

Wenn ich nen Haltepunkt in der Methode setze springt er da nicht rein. Es wird
anscheinend nur die Standardvalidierung für den Datentypen ausgeführt.

**Edit: ** Wenn ich mittels BindingGroup.ValidateWithoutUpdate() eine Validierung vor dem Speichern aufrufe, springt er in die Klasse. Allerdings enthält die BindingGroup dann keine Items. In value ist also tatsächlich meine BindingGroup nicht drin.

Laut dem Buch was hier vor mir liegt müsste das aber so funktionieren.. grmbl

06.10.2010 - 09:09 Uhr

Hallo Leute,

ich suche jetzt schon eine ganze Weile nach dem Fehler finde ihn aber nicht. Ich habe in einem Window einige Textfelder die an ein Objekt gebunden sind.
Mittels CommitEdit möchte ich bei erfolgreicher Validierung die Daten aus den Feldern in das Objekt übertragen lassen. Die Validierung soll aber auch nach Verlassen des Feldes stattfinden, so dass der User auf Fehleingaben direkt aufmerksam gemacht wird.

Hierzu habe ich eine BindingGroup deklariert:


    <Window.BindingGroup>
        <BindingGroup x:Name="BGKapazitaet">
            <BindingGroup.ValidationRules>
                <local:KapazitaetValidationRule ValidationStep="RawProposedValue"/>
            </BindingGroup.ValidationRules>
        </BindingGroup>
    </Window.BindingGroup>


 <ControlTemplate x:Key="Errortemplate1">
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition/>
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition/>
                    <ColumnDefinition Width="2"/>
                    <ColumnDefinition/>
                    <ColumnDefinition Width="2"/>
                    <ColumnDefinition/>
                </Grid.ColumnDefinitions>
                
                <AdornedElementPlaceholder Name="Adorner1" Grid.Column="0"/>
                <Image Source="Images/exclamation.png" Height="16" Width="16" Grid.Column="2"/>
                <Label FontSize="10" FontWeight="Bold" Grid.Column="4" VerticalAlignment="Center"
                       Content="{Binding ElementName=Adorner1, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}"/>
            </Grid>

        </ControlTemplate>


public class KapazitaetValidationRule : ValidationRule
    {
        public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
        {
            BindingGroup bg = (BindingGroup)value;

            if (bg.Items[0] != null)
            {
                Kapazitaet kapa = (Kapazitaet)bg.Items[0];

                if (kapa != null)
                {
                    bool Result = false;
                    object IdentNr;
                    object KstNr;

                    Result = bg.TryGetValue(kapa, "IdentNr", out IdentNr);
                    if (Result)
                    {
                        if ((int)IdentNr <= 0) return new ValidationResult(false, "Bitte geben Sie einen Artikel an!");
                    }
                    else
                    {
                        return new ValidationResult(false, "Bitte geben Sie einen Artikel an!");
                    }

                    Result = bg.TryGetValue(kapa, "KstNr", out KstNr);
                    if (Result)
                    {
                        if ((int)KstNr <= 0) return new ValidationResult(false, "Bitte geben Sie eine Kostenstelle an!");
                    }
                    else
                    {
                        return new ValidationResult(false, "Bitte geben Sie eine Kostenstelle an!");
                    }
                }
            }
            return ValidationResult.ValidResult;
        }
    }


                    <TextBox Grid.Column="2" Grid.Row="3" x:Name="txtArtikel" Margin="4" Validation.ErrorTemplate="{StaticResource Errortemplate1}" 
                             DataContext="_CurrentKapazitaet" Text="{Binding Path=IdentNr, BindingGroupName=BGKapazitaet}"/>

Wenn ich jetzt ein "f" in die Textbox eingebe bekomme ich anstatt meiner in der ValidationRule festgelegten Fehlermeldung immer die Meldung "Der Wert "f" konnte nicht konvertiert werden". Was mache ich falsch, warum wird meine definierte ValidationRule nicht ausgeführt?

11.08.2010 - 12:56 Uhr

Danke für Eure Antworten 🙂

@malignate: Wäre klasse wenn Du die Demo suchen könntest 🙂

11.08.2010 - 09:50 Uhr

Hallo Leute,

wir möchten bei uns im Hause zukünftige Anwendungen aufgrund der wunderbaren Gestaltungsmöglichkeiten gerne in WPF schreiben.

Zwei Fragen die ich trotz einer WPF-Schulung und mehrerer Bücher sowie google nicht komplett beantworten kann möchte ich Euch gerne stellen:

1.) Die Masken (Oberfläche/Windows) sollen komplett kundenindividuell anpassbar sein. Dass heisst man muss Steuerelemente verschieben und unsichtbar schalten können. Das möchte unser Chef am liebsten während der Laufzeit machen um es auch in Präsentationen zeigen zu können. Das mit dem Verschieben ist ja noch recht einfach zu lösen, sofern man Canvas benutzt. Mit dem Grid-Layout wird es vermutlich unmöglich, oder sehe ich das falsch? Ich würde eigentlich lieber das Grid-Layout benutzen, weil die Oberfläche dadurch viel strukturierter wird.

2.) Falls das mit dem Verschieben während der Laufzeit nicht geht, besteht die Möglichkeit innerhalb der Anwendung verschiedene XAML-Dateien für ein und dasselbe Window zu benutzen? Natürlich nicht gleichzeitig, sondern so dass das Layout halt Parameter gesteuert wechseln kann. Dann könnte man ggf. pro Kunde eine angepasste XAML-Datei erstellen.

Vielen Dank!

Gruß Markus

14.01.2010 - 11:01 Uhr

Die Lösung ist alles aus dem Debugverzeichnis zu löschen. Bin durch einen Haltepunkt darauf gekommen: (VS2008) Debuggen funktioniert nicht richtig

11.01.2010 - 14:59 Uhr

Hallo zusammen,

ich habe auf meinem lokalen Rechner eine VS2008-Installation. Dort wird ein Webservice angesprochen. In den Webservice wurde ein neues Feld eingefügt. Ich habe die Klassen per WSDL neu generiert und alles ist wunderbar. Möchte ich jetzt das Projekt (liegt auf einem Netzlaufwerk) auf einem anderen Rechner mit VS2008 öffnen kennt er das neue Feld nicht. Das lässt mich vermuten, dass Visual Studio die Klassen irgendwie cached. Kann man das abstellen?

Vielen Dank und Gruß

10.11.2009 - 13:29 Uhr

Der EML-Parser funktioniert übrigens nicht. Läuft auf unhandled Exceptions bei bisher allen EML-Dateien (10 Stück ausprobiert).

10.11.2009 - 09:58 Uhr

Da bleibt mir wohl nichts anderes übrig als nachzubauen 🙁

09.11.2009 - 16:18 Uhr

Ich benötige sie leider original getreu. D. h. es soll genauso aussehen als wenn es aus Outlook Express bzw. David InfoCenter gedruckt werden würde.

Mit dem normalen Outlook wäre das ganze überhaupt kein Problem. Aber die API vom David InfoCenter erlaubt es ja nicht mal E-Mails zu drucken... X(

09.11.2009 - 14:51 Uhr

Hallo zusammen,

ich muss im Rahmen eines Projektes EML-Dateien ausdrucken. Zur Verfügung stehen mir David InfoCenter und Outlook Express. Leider ist es mit diesen beiden Programmen anscheined nicht möglich das ganze automatisiert zu machen.

Outlook Express unterstützt den /p-Parameter nicht. David InfoCenter ebensowenig.

Gibt es eine andere Möglichkeit die Mails original getreu zu drucken ohne das irgendein Fenster aufspringt?

09.11.2009 - 08:57 Uhr

Hallo zusammen,

ich bin mir nicht sicher ob ich im richtigen Forum poste, die anderen schienen mir aber auch nicht ganz passend zu sein 😉

Ich suche einen TIFF-Drucker den ich aus C# heraus ansteuern kann. Ich möchte ein beliebiges Dokument als TIFF drucken und ohne Dialog direkt in einem bestimmten Verzeichnis (mit vorgegebenen Dateinamen) ablegen. Für PDF-Dateien gibt es sowas en Masse. Für TIFF-Dateien bin ich leider nicht wirklich fündig geworden.

Kennt jemand zufällig so einen Drucker?

02.11.2009 - 11:41 Uhr

Hi,

ich muss einen String mit Blowfish verschlüsseln und möchte dafür die Chilkat-Komponenten benutzen. Das klappt aber nicht so wie ich mir das vorstelle und ich finde den Fehler leider nicht. Vielleicht könnt Ihr mir helfen:


byte[] key;
byte[] encrypted = null;
byte[] decrypted = null;

ASCIIEncoding enc = new ASCIIEncoding();
key = enc.GetBytes("67b7bf4a5247bdb33d7b8fac7dc26253");

Chilkat.Crypt crypt = new Chilkat.Crypt();
crypt.SecretKey = key;
crypt.SetAlgorithmBlowfish(); 

encrypted = crypt.EncryptStr("testtest");
Console.WriteLine(enc.GetString(encrypted));

Es müsste als verschlüsselter String jetzt "XUdTeaOia/djIG0UIEtbVQ==" rauskommen. Klappt aber nicht. Was mache ich falsch? Ist die Umwandlung vom Array in den String per GetString richtig?

15.06.2009 - 21:14 Uhr

Das mit dem @ hatte ich schon probiert und die Bedeutung ist mir bekannt. Wenn ich beim Debuggen über "value" (von spalte.Value) gehe zeigt er "\n" für die Zeilenumbrüche an.

Habe es jetzt mit substring gelöst, wobei ich trotzdem noch gerne verstehen würde, was ich genau falsch mache....

15.06.2009 - 20:57 Uhr

Hallo,

ich habe gerade ein Problem was ich absolut nicht verstehe. Ich hoffe bzw. denke dass Ihr mir weiterhelfen könnt:

Folgender Input:

<td align=\"center\" valign=\"middle\">\n                  \n                    0:1\n                  &nbsp;</td>

Folgender regulärer Ausdruck:

>(.*?)</td>

So verarbeite ich den String im Quellcode:

Match spielergebnis = Regex.Match(spalte.Value, ">(.*?)</td>", RegexOptions.IgnoreCase);

Damit müsste ich jetzt zwei Gruppen wiederbekommen. Es kommt aber nur eine Gruppe und die ist leer.

string[] ergebnis = spielergebnis.Groups[1].ToString()

Im RegEx-Lab sieht das so aus:

siehe Anhang

Da funktioniert es so wie es soll. Warum bei mir im Quellcode nicht?

Danke!

24.04.2009 - 08:45 Uhr

Leider nicht bzw. ich muss es mal abklären.

23.04.2009 - 15:24 Uhr

Hallo,

ich muss einen Webservice einbinden, den wir von einem anderen Unternehmen zur Verfügung gestellt bekommen haben.

Ich habe es mit dem WSDL-Tool und mit dem Einbinden per Webverweis versucht. Die Klasse wird vom WSDL-Tool erstellt, aber leider ohne die Methoden um die es eigentlich bei dem WS geht.

Beim Webverweis steht folgender Kommentar in der Klasse:

// CODEGEN: Die getModifiedCustomerData-Vorgangsbindung von Namespace 'http://xxx.xxxx.xxx' wurde ignoriert. Die Typenangabe für use=literal-Meldungen wird nicht unterstützt. Typname='CustomerDataList' aus targetNamespace='http://xxx.xxx.xxxx/customer' kann als oberste Ebene eines Elements nicht verwendet werden.

Hat jemand eine Idee was das genau bedeutet? Google und die MSDN spucken hierzu rein gar nichts aus.

Danke im voraus!

20.03.2009 - 17:41 Uhr

Hallo Th69,

danke für Deine Antwort 🙂
Mit Visual Studio 2008 läuft es jetzt ohne flackern (Autosize hatte ich vorher schonmal auf DataGridViewAutoSizeColumnMode.None gesetzt). Allerdings ist das Grid, wie soll ich sagen, ziemlich langsam. D. h. es scrollt total langsam. Ich spiele schon mit dem Gedanken das Grid manuell, ohne BindingList zu füllen...

P.S: Ungarische Notation ist in C# verpöhnt...

Mag sein, bin ich aber aus der Firma gewöhnt 😉

Edit sagt: Ein Update des Grafikkartentreibers hat Abhilfe gegen das langsame Grid geschaffen!

20.03.2009 - 08:53 Uhr

Komischerweise flackert es bei mir auf der Arbeit in Visual Studio 2008 nicht. Zuhause nutze ich Visual Studio 2005. Keine Ahnung ob es daran liegt, nachher mal die Express-Version von 2008 zuhause installieren und testen.

19.03.2009 - 23:16 Uhr

ich versuche eine eigene Klasse zu schreiben die ich in einem DataGridView über DataSource anzeigen kann.

Habt ihr dafür eine Tutorial.

Sofern jemand eine Lösung für das Flackern hat, hast Du in meinem gerade erstellten Thread ein wunderbares Beispiel: DataGridView flackert total und bewirkt hohe CPU-Auslastung

19.03.2009 - 23:15 Uhr

Hallo,

ich habe eine BindingList an ein DataGridView gebunden. Das Füllen und Ändern an sich funktioniert soweit auch sehr gut. Am Anfang wird meine Liste mit 72 Einträgen gefüllt. Dabei fängt das Grid bzw. die ganze Maske furchtbar an zu flackern und die CPU-Auslastung geht sage und schreibe auf 50 % hoch. Das Grid hat nur drei Spalten die minimal befüllt werden. Wenn das Grid vollständig gefüllt ist flackert es immer noch 8o

Das Autosizing scheint auch keine Auswirkungen zu haben (es kommt mit und ohne Autosize das komische Flackern).


BindingList<Tor> Torbelegungen = new BindingList<Tor>();
         dgBelegung.AutoGenerateColumns = false;

         DataGridViewTextBoxColumn makeColumn = new DataGridViewTextBoxColumn();
         makeColumn.DataPropertyName = "Tornummer";
         makeColumn.HeaderText = "Tornummer";
         makeColumn.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
         dgBelegung.Columns.Add(makeColumn);

         makeColumn = new DataGridViewTextBoxColumn();
         makeColumn.DataPropertyName = "Spedition";
         makeColumn.HeaderText = "Spedition";
         makeColumn.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
         dgBelegung.Columns.Add(makeColumn);

         makeColumn = new DataGridViewTextBoxColumn();
         makeColumn.DataPropertyName = "DatumUhrzeit";
         makeColumn.HeaderText = "Datum/Uhrzeit";
         makeColumn.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
         dgBelegung.Columns.Add(makeColumn);

         dgBelegung.AutoSize = true;
         dgBelegung.DataSource = Torbelegungen;

         for (int i = 1; i <= 72; i++)
         {
            Torbelegungen.Add(new Tor(i, "", ""));
         }

   class Tor : INotifyPropertyChanged
   {
      public Tor(int pi_intTornummer, string pi_strSpedition, string pi_strDatumUhrzeit)
      {
         m_intTornummer = pi_intTornummer;
         m_strSpedition = pi_strSpedition;
         m_strDatumUhrzeit = pi_strDatumUhrzeit;
      }
      
      public event PropertyChangedEventHandler PropertyChanged;

      private int m_intTornummer;

      public int Tornummer
      {
         get { return m_intTornummer; }
         set 
         { 
            m_intTornummer = value;
            this.NotifyPropertyChanged("Tornummer");
         }
      }
      private string m_strSpedition;

      public string Spedition
      {
         get { return m_strSpedition; }
         set 
         { 
            m_strSpedition = value;
            this.NotifyPropertyChanged("Spedition");
         }
      }
      private string m_strDatumUhrzeit;

      public string DatumUhrzeit
      {
         get { return m_strDatumUhrzeit; }
         set 
         { 
            m_strDatumUhrzeit = value;
            this.NotifyPropertyChanged("DatumUhrzeit");
         }
      }

      private void NotifyPropertyChanged(string name)
      {
         if (PropertyChanged != null)
             PropertyChanged(this, new PropertyChangedEventArgs(name));
      }
   }

Ich verstehe absolut nicht, warum so eine in meinen Augen total einfache Sache so ein Flackern mit hoher CPU-Last verursacht. Habt Ihr eine Idee??