Laden...

Forenbeiträge von Quaneu Ingesamt 692 Beiträge

01.08.2012 - 20:49 Uhr

Musste leider schmerzlich feststellen, das dies auch keine Lösung ist!

Denn eigentlich dürfte PersonVM gar nicht wissen ob es selektiert ist, denn wenn man es später wieder an eine andere Itemsource bindet, kann es z.B. sein, dass es da auf einmal im neuen "Control" selektiert wird... daher finde ich diese Lösung langsam schlecht.

Des weiteren habe ich auch gelesen, dass diese Lösung nicht immer funktioniert z.B. bei Virtualizingstackpanel kann diese Lösung zu falschen Ergebnisse führen...

Was mich nun wieder zu der Frage bringt, wie man es "richtig" macht...

Schöne Grüße
Quaneu

31.07.2012 - 12:31 Uhr

Hallo basstscho,

ist die Zeile

btnTeach.Click += new RoutedEventHandler(btnExitClick);

nicht falsch und sollte

btnExit.Click += new RoutedEventHandler(btnExitClick);

heißen?

Wobei Abt natürlich recht hat. Commands sind der saubere Weg.

Schöne Grüße
Quaneu

31.07.2012 - 12:12 Uhr

Das Problem ist, dass ich eben nicht will, dass sich z.B. der TreeView und das Datagrid gegenseitig beeinflussen (bezüglich IsSelected).
Da es komisch ist, wenn man im Datgrid eine andere Zeile selektiert und auf einmal springt der TreeView an eine andere Stelle und zeigt dann was anderes an.

=> Ich baue ein Property IsSelectedInDataGrid und eins IsSelectedInTreeView, damit sie sich nicht gegenseitig in die Quere kommen.

31.07.2012 - 10:36 Uhr

Vielen Dank für Deine Hilfe.

Jetzt bin ich leider auf ein weiteres Problem gestoßen...

Ich habe z.B. eine Instance von PersonVM, die ich in zwei TreeViews oder in einem TreeView und einem DataGrid anzeigen will. Beide (TreeView oder DataGrid) binden sich ja an IsSelected von PersonVM => selektiere ich in einem TreeView bzw. DataGrid eine Person, hat dies auswirkungen auf den anderen TreeView bzw. auf das andere DataGrid, was zu Fehlern führen kann.

=> Man kann mit diesem Ansatz nicht eine Instance in verschiedenen Views benutzten.

Gibt es hierfür eine Lösung? Den wenn ich nun Clone bekomme ja die andere View z.B. nicht mehr mit, dass sich der Name einer Person geändert hat...

Schöne Grüße
Quaneu

30.07.2012 - 23:31 Uhr

Hallo Hunv,

ich würde mir mal HierarchicalDataTemplate anschauen, um einen Treeview zu befüllen. Damit und mit einem Konverter könntest Du dein Problem wahrscheinlich "eleganter" lösen.

Schöne Grüße
Quaneu

30.07.2012 - 09:15 Uhr

Hallo *,

ich habe folgendes Verhalten beim DataGrid, das ich nicht nachvollziehen kann...

Ich habe z.B. folgende Klasse TestVM


public sealed class TestVM
{
   public TestVM(IEnumerable<PersonVM> personen)
   {
      this.Personen = personen;
   }

   public IEnumerable<PersonVM> Personen { get; private set; }
}

dazu ein UserControl TestUserControl


<UserControl x:Class="TestUserControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
	<DataGrid ItemsSource="{Binding Personen}" IsReadOnly="True">
		<DataGrid.Columns>
			<DataGridTextColumn Header="Status" Binding="{Binding Vorname}" Width="Auto"/>
			<DataGridTextColumn Header="Name" Binding="{Binding Nachname}" Width="50*" />
			<DataGridTextColumn Header="Parent" Binding="{Binding Nick}" Width="50*"/>
		</DataGrid.Columns>
	</DataGrid>
</UserControl>

desweiteren habe ich ein DataTemplate


<DataTemplate DataType="{x:Type Test:TestVM}">
	<Test:TestUserControl/>
</DataTemplate>

In einem weiterem ViewModel MainVM habe folgendes Property


public Object Content
{
	get { return this._content; }
	set
	{
		this._content = value;
		NotifyPropertyChanged("Content");
	}
}

An dieses bindet sich ein ContentPresenter und wenn ich nun in MainVM z.B.


...
this.Content = new TestVM(personen);

schreibe müsste "normal" das TestUserControl im ContentPresenter angezeigt werden. Doch dies passiert nur dann wenn ich keinen "eigenen" Style für das Datagrid definiert habe. Denn wenn ich einen Style für das Datagrid definiert habe bekomme ich folgende Fehlermeldungen:

Fehlermeldung:
System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.DataGrid', AncestorLevel='1''. BindingExpression:Path=AreRowDetailsFrozen; DataItem=null; target element is 'DataGridDetailsPresenter' (Name=''); target property is 'SelectiveScrollingOrientation' (type 'SelectiveScrollingOrientation')
System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.DataGrid', AncestorLevel='1''. BindingExpression:Path=HeadersVisibility; DataItem=null; target element is 'DataGridRowHeader' (Name=''); target property is 'Visibility' (type 'Visibility')

Dazu sei gesagt, dass in dem Style kein Binding für diese Properties auftaucht...

Daher meine Frage, kennt jemand dieses Problem bzw. kennt jemand schon die Lösung?

UPDATE:
Ich kann den Fehler noch weiter eingrenzen. Wenn der Style den RowStyle nicht überschreibt, funktioniert es auch.

Mit diesem RowStyle funktioniert es nicht...


<Style x:Key="DataGridRowStyle" TargetType="{x:Type DataGridRow}">
	<Setter Property="BorderBrush" Value="Black" />
	<Setter Property="SnapsToDevicePixels" Value="true" />
	<Setter Property="Validation.ErrorTemplate" Value="{x:Null}" />
	<Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
	<Style.Triggers>
		<Trigger Property="IsSelected" Value="True">
			<Setter Property="Background" Value="LightBlue" />
		</Trigger>
	</Style.Triggers>
</Style>

Jedoch wenn man


<Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />

auskommentiert funktioniert es wieder. D.h. dieses Binding löst die oben beschriebene Fehlermeldung aus.

Schöne Grüße
Quaneu

27.07.2012 - 18:25 Uhr

Hi,
Du könntest es mal mit IDataErrorInfo probieren, statt Validdationrule.
Benutzt Person die Schnittstelle INotifyPropertyChanged?

Gruß
Quaneu

27.07.2012 - 18:09 Uhr

aber das ViewModel des Fensters sollte sicherlich irgendwie Zugriff auf das ViewModel mit den Personen haben.

Das hat es auch. Somit bekomme ich auch immer alle selektierten Personen.
Das "Problem" dabei ist, dass ja das ViewModel vom Fenster alle Personen "frägt", bist Du selektiert.
Doch das ViewModel vom Fenster soll ja z.B. bei einer Änderung der selektierten Person eine Aktion ausführen. Also genau umgekehrt.

Das hieße es würde nur über Events möglich sein...

Wäre dies der "gängige" Weg? Oder löst man dies mit Mvvm auf eine andere Art?

27.07.2012 - 16:09 Uhr

Hallo zusammen,

ich weiß das es zu diesem Thema schon 1000de Artikel gibt. Doch habe ich noch eine Frage dazu, die ich noch nicht sauber "beantworten" konnte...

Ich habe z.B. ein ViewModel PersonVM für eine Klasse Person. In dieser habe ich unter anderem zwei Properties IsSelected und IsExpanded. Diese habe ich an das TreeViewItem gebunden:


<TreeView.ItemContainerStyle>
	<Style TargetType="{x:Type TreeViewItem}">
		<Setter Property="IsExpanded" Value="{Binding Path=IsExpanded}" />
		<Setter Property="IsSelected" Value="{Binding Path=IsSelected}" />
	</Style>
</TreeView.ItemContainerStyle>

Dies klappt alles wunderbar.

Doch habe ich nun folgendes Problem bzw. Probleme...
Z.B. soll in Abhängigkeit ob ein TreeViewItem selektiert ist ein Button enabled oder disabled sein. Dazu müsste aber das Viewmodel für das Fenster, in dem z.B. Personen angezeigt werden, wissen dass eine Person selektiert ist.
Oder aber ich habe z.B. links den TreeView mit Personen und wenn ich eine Person anklicke, soll rechts eine Visitenkarte angezeigt werden. Doch bisher weiß nur das ViewModel für die Person, dass es selektiert ist und eben nicht das ViewModel des Fensters, dass dann die entsprechenden Aktionen ausführt.

Ich habe es schon mit einen static Property

public static List<PersonVM> SelectedItems{get;set;}

in dem VieModel für das Fenster probiert, doch leider klappt dies auch nicht, bzw. müsste dann die Klasse Person wissen, in welchem Fenster es angezeigt wird, damit es sich z.B. in SelectedItems hinzufügen kann.

Daher meine Frage, wie bekommt man diese Probleme mit MVVM gelöst?

Schöne Grüße
Quaneu

23.07.2012 - 09:14 Uhr

Vielen Dank für Deine Antworten.

Zu Antowort 1 habe ich noch eine Frage:
Das Problem ist, dass die Matrizen immer unterschiedlich groß sind, d.h. folgender Code würde so nicht funktionieren,


<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Path=Matrix}">
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding Path=[0]}" Header="x[0]" />
        <DataGridTextColumn Binding="{Binding Path=[1]}" Header="x[1]" />
        <!--- etc pp --->
    </DataGrid.Columns>
</DataGrid>

da n in x[n] immer unterschiedlich groß sein kann.

Falls ich einen Vektor der 65000 Einträge hat anzeigen will, kann ich diesen auch "drehen", damit habe ich nur 1 Spalte und hoffentlich keine Probleme mehr.

Ich denke ich werde es mal testen, ob es geht. Im schlimmsten Fall muss man dann wohl ein eigenes Control bauen, dass damit zurecht kommt.

Schöne Grüße
Quaneu

17.07.2012 - 10:55 Uhr

Hallo,

die Fragen nehmen leider kein Ende...

Ich will eine Matrix in einem DataGrid darstellen. D.h. ich habe z.B. eine Int32[][] Matrix mit n Zeilen und m Spalten. Dieses will ich nun in einem Datagrid anzeigen und stoße schon auf das erste Problem.

Per Binding schaffe ich es nicht das DataGrid z.B. wie folgt zu füllen:


        x[0]  x[1]  x[2] ...
y[0]    2     3      5       ...
y[1]    7     11    13      ...
...

Wobei 2, 3, 5, 7, 11, 13 der Inhalt der Matrix ist. Die Spalten sollen in diesem Fall DataGridTextColumns sein.

Das zweite Problem bzw. Frage ist, es gibt auch Fälle in denen es keine DataGridTextColumns sind sondern DataGridComboBoxColumns. Wobei jede ComboBox den selben Inhalt haben muss. Wenn ich nun z.B. 65000 Spalten habe, werden dann 65000 ComboBoxes angelegt?
Eine weitere Frage ist, wie ist die Performance von einem Datagrid bei sehr vielen Einträgen (DataGridTextColumns oder DataGridComboBoxColumns)?

Schöne Grüße
Quaneu

17.07.2012 - 10:40 Uhr

Anders sieht es höchstens aus, wenn du im Code das Item setzt.

Das ist leider der Fall. Equals wurde nicht überschrieben, da es immer auf die Situation ankommt, wann etwas gleich ist.

Ich habe jetzt einen Wrapper (ViewModel) für diese Klassen geschrieben und das klappt wunderbar.

Vielen Dank für eure Hilfe
Quaneu

14.07.2012 - 20:08 Uhr

Also ich habe Referenztypen.
Im normalen Modus kann man die Objekte an Hand einer Uuid vergleichen, doch gibt es Modi im Programm, da kann man sich auf diese nicht mehr verlassen. Leider habe ich auf dieses Verhalten keinen Einfluss (ist meine "Vorgabe") .
Dies bedeutet, dass je nach Modus im Programm andere Eigenschaften als Vergleichskriterium dienen können. Und daraus ergibt sich für mich nun dieses Problem.

14.07.2012 - 19:43 Uhr

Hallo nochmals,

alle guten Dinge sind 3 🙂

ich habe z.B. eine ComboBox, die ich per Binding "bediene":


<ComboBox ItemsSource="{Binding Modi}" SelectedItem="{Binding Modus}"/>

SelectedItem benutzt Equals() von dem jeweiligen Objekt. Doch liefert Equals() in machen Fällen ein falsches Ergebnis, daher arbeite ich mit IEqualityComparer<T> oder IComparer<T>.

Wie schaffe ich es, dass nun nicht mehr Equals() benutzt wird zum selektieren sondern ein beliebiger IEqualityComparer<T> oder IComparer<T>?

Schöne Grüße
Quaneu

13.07.2012 - 19:10 Uhr

Vielen vielen Dank für Deine Hilfe und Hinweise.
Ich werde diese berücksichtigen und versuchen so gut wie möglich umzusetzen.

13.07.2012 - 16:13 Uhr

Die Anwendung ist schon recht alt (mind. 8 Jahre) und um dieser nun einen frischen Anstrich zu verpassen wollte ich eben gleich zu WPF wechseln und nicht wieder alles in Forms machen.

Ich habe schon mit WPF gearbeitet und kenne auch MVVM, doch dies wollte ich dann nach und nach für alle Controls nachziehen. Denn zur Zeit muss ich immer zwei Codestände pflegen und diesen Zustand will ich so kurz wie möglich beibehalten. Daher erst alle Controls "zeichnen" und Code anpassen, so dass die Anwendung mit WPF läuft und dann MVVM usw. einführen... so war zumindest der Plan... 🙁 ...

13.07.2012 - 15:54 Uhr

Wo fange ich nur an...

Ich versuche gerade ein Forms Anwendung nach WPF zu "überführen". Dies ist leider keine kleine Anwendung und Zeit spielt leider auch eine Rolle.
In dieser wurde so eine abstrakte Basisklasse eingeführt, um Code-Duplicates zu vermeiden. Um nun Zeit zu sparen wollte ich erst mal nicht "viel" ändern. Daher wollte ich diese beibehalten.

Es gibt zur Zeit fünf Controls die alle recht ähnlich sind, z.B. haben alle eine TextBox für einen Namen oder eine ComboBox für den Status usw.. Daher wurden in der Basisklasse abstrakte Properties definiert wie z.B.


public abstract TextBox Name{get;}

In dieser Klasse wurden dann auch die Events abonniert, z.B.


protected void RegisterEvents()
{
   if(this.Name!=null)
   {
     this.Name.TextChanged+=...
   }
}

usw.

Und nun kommt WPF... und ich weiß nicht wie man dies nun am schönsten abbildet.

Grüße
Quaneu

13.07.2012 - 15:26 Uhr

Hallo,

ich habe mal wieder eine generelle Frage zu WPF.

Ich hab eine abstrakte Basisklasse die von UserControl ableitet


abstract class DataUserControl : UserControl, IDataControl
{
//...
}

Diese möchte ich nun für all meine UserControls verwenden.

Beispiel:


class TestUserControl: DataUserControl 
{
}


<DataUserControl x:Class="TestUserControl"
		xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
		xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
		xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
>
</DataUserControl>

Doch leider habe ich schnell gemerkt, dass dies wohl nicht der richtige Weg ist, da z.B. der Designer seinen Dienst quittiert, da er keine Instanz der Basisklasse anlegen kann.

Kann ich dieses Problem nur duch CustomControls umgehen, die dann von dieser Basisklasse ableiten?


class TestCustomControl: DataUserControl 
{
}

Oder gibt es hierfür noch bessere Vorgehensweisen?

Schöne Grüße
Quaneu

13.07.2012 - 14:52 Uhr

Vielen Dank für Deinen Hinweis. Hab es jetzt genau so gemacht.

11.07.2012 - 15:53 Uhr

Hab jetzt doch noch eine kleine Frage dazu.

Ich habe nun in meinen Application.Resources die Images "angelegt". Nun wird jedes Image z.B. in einem TreeView benutzt, d.h. es wird jedes Image mehrfach verwendet.
Dies geht aber nur wenn ich in den Resources bei alles Images


x:Shared="false"

setze, da sonst folgende Fehlermeldung kommt:> Fehlermeldung:

Specified element is already the logical child of another element. Disconnect it first.

Jetzt wollte ich nur noch wissen, ob es ein "sauberer" Weg ist x:Shared zu setzen?

Schöne Grüße
Quaneu

11.07.2012 - 09:52 Uhr

Gute Frage. Ich denke dann wohl eher ein Custom Control, da ich ja den TreeView später um ein paar Funktionalitäten erweitern will.

11.07.2012 - 09:20 Uhr

Super vielen Dank. Hab wohl zwischendurch zu lange Forms gemacht...

Schöne Grüße
Quaneu

11.07.2012 - 09:07 Uhr

Entschuldigt bitte meinen "schlampigen" Beitrag. Habe ihn gerade ein bisschen "aufgeräumt". Hoffe er ist nun besser verständlich.

Schöne Grüße
Quaneu

10.07.2012 - 23:12 Uhr

Hallo zusammen,

jetzt hab ich gleich noch eine Frage.

Ich habe in meinem Projekt embedded Bitmaps. Auf diese greife ich z.B. wie folgt zu Properties.Resources.MyBitmap.
So weit so gut, aber nun will ich dieses anzeigen z.B. in einem DockPanel. Doch leider bekomme ich dies nicht hin.

Wie schafft man es diese Bitmaps anzuzeigen?

Schöne Grüße
Quaneu

10.07.2012 - 21:59 Uhr

Hallo zusammen,

ich verstehe gerade nicht wieso folgendes Szenario nicht geht:

Habe ein eigenes UserControl namens Tree:


<TreeView x:Class="Controls.Tree" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
		xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
		xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006">
</TreeView>


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace Controls
{
	/// <summary>
	/// Interaction logic for Tree.xaml
	/// </summary>
	public partial class Tree : TreeView
	{
		public Tree()
		{
			InitializeComponent();
		}
	}
}

Nun will ich mein UserControl Tree wie folgt verwenden:


<Window x:Class="MainWindow.MainWindow"
		xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
		xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
                xmlns:controls="clr-namespace:Controls">

		<controls:Tree>
			<controls:Tree.ContextMenu>
				<ContextMenu>
					
				</ContextMenu>
			</controls:Tree.ContextMenu>
		</controls:Tree>
</Window>

Doch leider funktioniert die Zeile mit dem ContextMenu (controls:Tree.ContextMenu) nicht:

Fehlermeldung:
The attachable property 'ContextMenu' was not found in type 'Tree'.

Was muss ich machen, damit ich auf das ContextMenu "zugreifen" kann?

Schöne Grüße
Quaneu

04.05.2012 - 12:43 Uhr

Vielen Dank für eure Beiträge.

Exceptions kann normalerweise nur der Aufrufer angemessen behandeln.

Dies stimmt natürlich, doch habe ich Exceptions die gar nicht gefangen werden sollen, da sie z.B. auf Programmierfehler hindeuten bzw. hat die DLL einen gewissen Satz von Exceptions die geworfen werden können.
Der Kunde bzw. Nutzer kennt diese und behandelt diese selber. D.h. es gibt Exceptions die nicht gefangen werden sollen. Wird so eine Exception jedoch in einem Event geworfen, behandelt sie Forms selber und dies ist das unerwünschte Verhalten.

Viele Grüße
Quaneu

03.05.2012 - 21:24 Uhr

Hallo zusammen,

ich habe folgendes Problem mit Exception Handling in Forms.

Ich habe eine DLL, die ein Window anzeigen kann. Nun kann es vorkommen das die DLL Exceptions wirft, wenn z.B. fehlerhafte Daten ausgemacht werden usw. Dies kann jedoch auch in Event-Handlern der Form passieren. Jedoch greift hier dann das Exception Handling von Forms, d.h. der User bekommt die Exception in einer Art MessageBox zu sehen, bei der jedoch auch Continue klicken kann, was zu schwerwiegenden Fehlern führen kann.

Daher meine Frage, wie kann man in einer DLL diese Verhalten abstellen? In einer Application geht dies wohl über ThreadException und UnhandledException. Kann man dies auch für DLLs anwenden, wenn Sie z.B. Von Matlab benutzt werden?

Viele Grüße
Gennaro

23.04.2012 - 13:00 Uhr

Hallo zusammen,

ich hab eine Frage zum Drucken von FlowDocuments.

In einer RichTextBox habe ich ein FlowDocument, dass ich ausdrucken will. Dies mache ich so wie es in msdn vorgeschlagen wurde:


PrintDialog printdialog = new PrintDialog();

if ((printdialog.ShowDialog() == true))
{
printdialog.PrintDocument((((IDocumentPaginatorSource)this._richTextBox.Document).DocumentPaginator), "printing as paginator");
}

Dies funktioniert auch soweit ganz gut. Nur ist nach dem Drucken in der GUI nichts mehr von dem FlowDocument zu sehen. Erst wenn ich z.B. das Fenster in der Größe verändere, taucht es wieder aus.

Daher meine Frage(n), wieso passiert dies und wie kann man dieses Verhalten abstellen?

Schöne Grüße
Quaneu

03.03.2012 - 00:21 Uhr

Ich glaube ich habe jetzt endlich eine "Lösung". Wobei ich schon sehr erstaunt bin, dass man so viel Aufwand betreiben muss...

Die "Lösung" sieht wie folgt aus:
Ich habe einen CodeDomSerializer geschrieben, der verhindert, dass der Designer die BackColor für meine Controls setzt. D.h. aber auch, dass man im Designer die BackColor nicht setzten kann bzw. dass sie nach erneutem kompilieren wieder auf den "Default" zurückgesetzt wird.

Für bessere Vorschläge wäre ich sehr dankbar, da ich meine "Lösung" für nicht sehr schön halte...

Viele Grüße
Quaneu

02.03.2012 - 14:31 Uhr

Eventuell kannst du dir weiterhelfen, indem du vom Control ableitest und die entsprechenden Eigenschaften mit DesignerSerializationVisibility bzw. Designer Attributen dekorierst...

Dann müsste ich ein "zweites" Property für die BackColor einführen um diese Attribute zu werden. Doch dies finde ich eher unschön. Oder habe ich Dich falsch verstanden?

Viele Grüße
Quaneu

P.S.
Vielen Dank schon mal für Bemühungen

02.03.2012 - 14:17 Uhr

Wieso willst Du im Designer die Farbe ändern?

Das will ich ja gar nicht. Ich änder im Designer (also nicht in der *.Designer.cs Datei) ein Property und bei dieser Änderung wird in der *.Designer.cs eben auch das Property für die BackColor "geändert". Und dies ist mein Problem, da das Panel z.B. nun nicht mehr meine Farben aus der Klasse benutzt.

02.03.2012 - 12:58 Uhr

Ja, das klappt auch bei mir.

Doch wenn ich im Designer nun ein Property ändere und mir dann die *.Designer.cs anschaue steht bei mir:


this._myPanel.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(1)))), ((int)(((byte)(2)))), ((int)(((byte)(3)))));

Und somit bringt mir meine Klasse mit den Farben nichts mehr.

Und ich denke da genau so wie ihr *.Designer.cs sollte man niemals per Hand ändern.

02.03.2012 - 12:46 Uhr

Ich würde es ja auch gern vermeiden, aber leider wusste ich nicht wie ich es anders lösen konnte, außer in jedem Konstruktor nach InitializeComponent() die Farben zuweisen. Doch dieser Weg gefällt mir nicht, da ich im Designer nicht mehr das Control so sehe wie es dann dargestellt wird.
Ich würde am liebsten eigene Controls benutzten, doch wie oben schon geschildert, ändert auch hier der Designer die BackColor, obwohl ich nichts *.Designer.cs geändert habe.

02.03.2012 - 12:23 Uhr

Ich muss leider gestehen, dass ich sie bisher direkt in der *.Designer.cs geändert habe...

Also diesen Code habe ich in der *.Designer.cs geändert, da ich im Designer selbst nicht weiß, wie ich Farben aus meiner GuiColors-Klasse auswählen kann.


...
this._panel.BackColor = GuiColors.ControlBackground;
// davor stand hier:
//this._panel.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(1)))), ((int)(((byte)(2)))), ((int)(((byte)(3)))));
...

Ich hab sogar versucht ein eigenes Control zu erzeugen. Z.B. von Panel abgeleitet und im Konstruktor die Farbe zugewiesen.


public class MyPanel:Panel
{
   public MyPanel()
   {
      this.BackColor = GuiColors.ControlBackground;
   }
}

Doch auch wenn ich es so versucht habe, wurde in der *.Designer.cs wieder folgendes eingesetzt bzw. ersetzt, wenn ich im Designer was ändere.


this._panel.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(1)))), ((int)(((byte)(2)))), ((int)(((byte)(3)))));

bzw.


this._myPanel.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(1)))), ((int)(((byte)(2)))), ((int)(((byte)(3)))));

02.03.2012 - 10:30 Uhr

Hallo zusammen,

ich hab mal wieder ein Problem, dass mir schon seid 2 Tagen nicht zu beseitigen gelingt...

Ich wollte in einer Anwendung spezielle Farben, die ich häufig benutzt in einer Klasse ablegen. Z.B. so:


public sealed class GuiColors
{
   public static Color ControlBackground = Color.FromArgb(1, 2, 3);
}

Diese Farbe wollte ich dann z.B. all meinen Panels zuweisen (im Designer), damit ich nur noch eine Stelle muss, wenn ich mal eine andere Farbe wählen will.


this._panel.BackColor = GuiColors.ControlBackground ;

Doch leider macht mir der Designer ein Strich durch die Rechnung. Denn wenn ich in einem Control nun irgendwo z.B. die Hintergrundfarbe für ein beliebiges Control ändere, macht er
folgendes:


this._panel.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(1)))), ((int)(((byte)(2)))), ((int)(((byte)(3)))));

Dadurch ist aber mein ganzes "Konzept" hinfällig. und ich weiß leider nicht warum er das macht, denn bei Systemfarben macht er das ja auch nicht.

Hatte jemand schon mal das selbe Problem bzw. eine Lösung?

Viele Grüße
Quaneu

24.01.2012 - 09:16 Uhr

Und nochmals vielen Dank. Du hast mir gerade die Frage beantwortet, die ich noch gar nicht gestellt hatte 😃

Denn mit CreateControl() hat es doch nicht immer funktioniert, da es in manchen Fällen nicht sichtbar war und somit der Fall eingetreten ist, den Du beschrieben hast. Hab jetzt einfach von DataGridView abgeleitet und im Konstruktor CreateHandle() aufgerufen. Nun funktioniert es immer.

Auch wenn er schon älter ist, glaube ich, dass dieser Beitrag damit auch beantwortet ist (hab ich nämlich grade gefunden)

Datagridview Zeile selektieren Problem

Viele Grüße
Quaneu

22.01.2012 - 21:06 Uhr

Hallo herbivore,

vielen vielen Dank. Genau daran lag es. Jetzt funktioniert es. Wäre niemals auf die Lösung gekommen...
Habe die CreateControl() Methode benutzt, aber diese wirst Du gemeint haben 😃 (hab nämlich die CreateHandle() Methode nicht gefunden.

Viele Grüße und nochmals Danke
Quaneu

21.01.2012 - 22:27 Uhr

Hallo zusammen,

ich habe mal wieder ein Problem, bei dem ich einfach nicht weiter komme...

Ich habe ein Hauptfenster A in diesem befindet sich ein Panel B, welchem ich zur Laufzeit verschiedene Controls C zuweise (so eine Art Contentpresenter wie in WPF).
Dies klappt auch soweit ganz gut, doch nun tritt folgendes Problem auf:

In einem Control C, das ich zuweisen will befindet sich DataGridView, in welchem ich eine bestimmte Zeile selektiere. Dies passiert auch, doch wenn ich nun C B zuweise, selektiert er im DataGridView immer wieder die erste Zeile... und ich versteh nicht warum...

Der Code sieht ungefähr wie folgt aus:


this._activeController.Display(currentItem); // Hier wird C initialisiert auch welche Zeile im DataGridView selektiert werden soll
this._moduleContentView.MainControl.SetContent(moduleInformationControl); // Hier setze ich C in B ein

Viele Grüße
Quaneu

05.01.2012 - 22:48 Uhr

Also Singleton brauche ich nicht. Da ich die Forms schon öfter erzeugen darf, aber eben nur einmal anzeigen, d.h. falls die Form für z.B. die Suche offen ist darf ich sie einfach nicht nochmal anzeigen (anlegen). Falls ich sie zu mache und wieder auf machen will, darf ich sie aber wieder neu anlegen.

Mit der Mainform wird wohl auch nicht so richtig klappen, da es Dialoge gibt die von verschieden Forms aufgerufen werden könnten (z.B. Help oder About). D.H. die Mainform kann dies nicht überwachen.
Bin gerade am Überlegen ob ich eine Art Manager Klasse schreibe, die immer weiß welche Dialoge geöffnet sind.

Und was ich unbedingt noch loswerden muss:
Ich kann mich nur immer wieder bei Dir bedanken für Deine Bemühungen und Hilfe. Ein ganz großes Lob.

Grüße
Quaneu

05.01.2012 - 16:12 Uhr

So jetzt hab ich die Erlaubnis und schon eine "Lösung" für das besagte Problem.

Ich mach sie einfach nicht modal aber man darf nur immer ein Fenster des gleichen "Typs" öffnen (ist wahrscheinlich auch nicht sonderlich schön, aber schon mal ein Schritt in die richtige Richtung 😃 ).

Viele Grüße
Quaneu

05.01.2012 - 16:12 Uhr

Doch jetzt komme ich zu einer Design frage:
Wenn ich immer nur ein Fenster des gleichen "Typs" öffnen darf (z.B. immer nur ein Such-Fenster), könnte ich dies über ein statisches Property lösen, doch mir gefällt diese Lösung nicht sonderlich, daher wollte ich mal fragen, ob es nicht "schönere" Möglichkeiten gibt.

Viele Grüße
Quaneu

05.01.2012 - 15:47 Uhr

Nochmals vielen Dank.

Ich werde es versuchen. Das Problem ist, dass die Anwendung nicht darauf ausgelegt ist => es könnten ohne modale Dialoge fehlerhafte Daten erzeugt werden. Aber ich werde es mal genauer validieren und hoffen, dass es doch noch Hoffnung gibt.

Quaneu

05.01.2012 - 15:31 Uhr

Vielen Dank für deinen Hinweis. Leider muss ich die modalen Dialoge beibehalten, da ich die Anwendung nur übernommen habe und jetzt um dieses Feature erweitern möchte.

05.01.2012 - 14:42 Uhr

Hallo zusammen,

ich bin mal wieder auf eine Frage bzw. Problem gestoßen:

Ich habe eine Anwendung deren Hauptfenster ein modaler Dialog ist, von diesem aus können weitere Dialoge geöffnet werden (auch alle modal). Nun will ich aber ein nicht modales Fenster haben, in dem die Log-Einträge angezeigt werden. Jetzt ist dieses Fenster natürlich nicht mehr "erreichbar" wenn ich es offen habe und dann einen anderen Dialog (modal) öffne. Wie kann ich es in einer Anwendung schaffen, dass mein nicht modaler Dialog immer "erreichbar" ist?

Viele Grüße
Quaneu

23.12.2011 - 11:42 Uhr

Vielen Dank für deine Hilfe.

Werde ich gleich probieren.

Wünsch euch schöne Feiertage und eine guten Rutsch
Quaneu

22.12.2011 - 21:55 Uhr

Oje... jetzt steh ich auf dem Schlauch mit nem Brett vor dem Kopf...

Also bei mir ist bis jetzt immer die selektierte Zeile grau und die selektierte Zelle auch. Sprich man sieht die selektierte Zelle nicht. Erst wenn man 2 x mal auf die Zelle klickt wir diese wieder weiß (und der Rest der Zeile bleibt grau). Doch ich würde dies gern beim ersten Klick haben.

Vielen Dank schon mal für eure Geduld und Hilfe.

22.12.2011 - 16:13 Uhr

Da hast Du natürlich vollkommen recht.

Daher würde ich gerne die Zelle und die Zeile bei einem einfachen Klick markiert haben.

Damit meinte ich natürlich, dass sie unterschiedlich markiert werden sollten. Entschuldige bitte, da habe ich mich ein bisschen unklar ausgedrückt.

22.12.2011 - 15:43 Uhr

Mit Events mache ich nichts.

Folgendes ist bei mir der Fall
Ich klicke auf eine Zelle => die Zeile in der sich die Zelle befindet, wird farblich markiert (bei FullRowSelect), jedoch die Zelle, auf die geklickt wurde (1 x Klick) wird nicht "markiert" => Der User "weiß" nicht wenn er nun z.B. auf "a" klickt, in welche Zelle er schreibt.

Daher würde ich gerne die Zelle und die Zeile bei einem einfachen Klick markiert haben.

22.12.2011 - 14:27 Uhr

Hallo zusammen,

ich habe gerade Schwierigkeiten mit dem DataGridView. Ich würde gern folgendes haben:

Wenn ich auf eine Zelle im DataGridView klicke, soll die ganze Zeile z.B. grau markiert werden (daher FullRowSelect) und zusätzlich die Zelle in die geklickt wurde. Doch leider bekomme ich dieses Verhalten einfach nicht hin...

Wie könnte man dies umsetzten?

Viele Grüße
Quaneu

11.10.2011 - 22:52 Uhr

Vielen Dank für Eure Hinweise.

Bin gerade darüber ein Custom Control für 3D Zeichnungen zu erstellen und dabei sind mir genau diese "Problem" begegnet, als ich Mvvm anwenden wollte.

Vielen Dank nochmals.

Grüße
Quaneu