Laden...
Avatar #avatar-1693.jpg
citizen.ron myCSharp.de - Member
Selbst. Software-Architekt Frankfurt / Main Dabei seit 23.07.2005 432 Beiträge
Benutzerbeschreibung

Forenbeiträge von citizen.ron Ingesamt 432 Beiträge

21.02.2007 - 14:48 Uhr

@JAck30lena:
stimmt, war noch ein rest aller meiner verzweifelten versuche, woran´s liegen könnte, danke!

@bubblez:
ja, aber das hilft mir nur im code weiter; wenn ich im designer die dinger einstellen will, geht das nicht, oder?
"so viele sinds ja nicht":
nachstehendes augenblicklich * 16:


      // TextAlign
         /// <summary>
         /// 
         /// </summary>
         [Browsable(true)]
         [Category("Appearance")]
         [DesignerSerializationVisibility( DesignerSerializationVisibility.Visible)]
         public HorizontalAlignment TextAlign
         {
             get { return Textbox.TextAlign; }
             set { Textbox.TextAlign = value; }
         }


🙂

thanx jedenfalls!

21.02.2007 - 14:13 Uhr

hi junky,

also deine lösung hat meine aufmerksamkeit immerhin darauf zurückgelenkt, dass man natürlich ein UserControl erstellen kann und ein rotes Asterisk rechts oben NEBEN die eingebettete TextBox plaziert.

der nachteil ist, dass man alle Properties der TextBox, auf die man von "draussen" drauf will, quasi manuell ins eigene Control umleiten muss:


 public new string Text
 {
    get { return textBox.Text; }
    set { textBox.Text = value; }
 }

scheint mir aber im augenblick bei allen controls der gangbarste weg zu sein, die OnPaint nicht so problemlos überschreiben lassen wollen.

also danke 🙂

gruß

21.02.2007 - 12:39 Uhr

hi,

wurde das problem von cook jetzt schon gelöst?

würde mich freuen, wenn das so wäre, denn @herbivore:
es recht wie schon cook beschrieben hat NICHT, das eigene zeichnen nach base.OnPaint vorzunehmen:
die textbox zeigt den text nicht mehr korrekt an, gelöschte textfragmente werden weiterhin angezeigt etc.

hier der code der aber nur funktioniert, solange die textbox KEINEN text enthält 😦


public DBTextBox() : base()
{
   this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.ResizeRedraw | 
         ControlStyles.UserPaint, true);       
}
protected override void OnPaint(PaintEventArgs e)
{
   base.OnPaint(e);

// Add obligatory asterisk
   Graphics g = CreateGraphics();
   g.DrawString("*", new Font(new FontFamily("Tahoma"), 10, FontStyle.Bold), 
                       Brushes.Red, new PointF(Width-13, -2));

}

Ergebnis:

Wie man sieht, ist meine Absicht, ein rotes Asterisk in der rechten oberen Ecke zu zeigen, um ein Pflichtfeld anzudeuten.

Man sieht ausserdem, dass das Überschreiben der Paint Methode auch den Font kaputtmacht, der ist nämlich per Designer eigentlich auf Tahoma 8 regular (und nicht MSSansSerif 9 fett) eingestellt.

Freue mich über jede Anregung...

gruß

ron

15.02.2007 - 18:56 Uhr

hi zusammen,

leider habe ich keine befriedigende antwort in den suchbegriffen gefunden:

wie binde ich ein radiobutton an eine tabellenspalte (konkretes beispiel: Spalte [Geschlecht] ist ein nvarchar(1), "m" soll radiobutton für "Männlich" auf Checked = true setzen, Spalteninhalt "w" soll radiobutton für weiblich auf false setzen.

an alle voreiligen: folgendes funktioniert nicht:


myRadioButton.DataBindings.Add("Checked", "PERSON", "Geschlecht");

danke für eure hilfe

ron

04.12.2006 - 10:28 Uhr

hi khalid,
tricky problem 🙂

ich könnte mir 2 ansätze vorstellen.

  1. cursorbasiert, nicht so schnell, aber dafür leichter zu programmieren
    du stellst einen cursor bereit, der nach datum sortiert ist und checkst halt wirklich für jeden eintrag, ob sich die menge gegenüber dem vorangehenden eintrag geändert hat.
    je nachdem, ob du die daten persistent brauchst oder nur "mal kurz" zur anzeige im gui, packst du dann eben die (bereits aggregierten!) daten z.b. in eine neue tabelle.

  2. inner join der quelltabelle mit sich selbst über sinngemäß "t1.Datum + 1 Tag = t2.Datum" und sortierst nach datum
    das ist allerdings ne kopfnuss, für deren knacken ich noch ein paar informationen über die tabelle bräuchte (und ein bisschen mehr zeit).

also probiers am besten mit dem cursor.

gruß
ron

04.12.2006 - 09:25 Uhr

hi khalid,

aus deiner frage geht leider nicht hervor, was denn eigentlich das gruppierungsmerkmal sein soll.

willst du in zweiergruppen von tagen gruppieren, sprich IMMER genau ZWEI tage zusammenfassen?

03.12.2006 - 14:15 Uhr

genau das funktioniert bei mir nicht.
laut debugger wurde definitv das richtige config-file geöffnet, die ausgewiesenen sections aber sind nicht meine sections (die über settings erreichbaren) sondern irgendwelche anderen...

noch andere ideen?

03.12.2006 - 00:16 Uhr

hallo,

hab eine dll, sagen wir "Baby.dll", die von einer anderen dll, z.b. "Mama.dll" geladen wird.

mama.dll ist also die mutteranwendung, allerdings als Outlokk AddIn (grins)

und jetzt soll baby.dll zur laufzeit an die settings von mama.dll ran.
das wäre in dem fall ja wohl mama.dll.config.

mein ansatz:


string configName = "mama.dll";
config = ConfigurationManager.OpenExeConfiguration(configName);

der debugger zeigt, dass auch tatsächlich die config geöffnet wurde.
jetzt hab ich aber keine ahnung, wie ich denn in dieser config eigentlich an meine settings herankomme.


<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
            <section name="CRM.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
        </sectionGroup>
    </configSections>
    <userSettings>
        <CRM.Properties.Settings>
            <setting name="ServerName" serializeAs="String">
                <value>.</value>
            </setting>
            <setting name="DatabaseName" serializeAs="String">
                <value>CBO</value>
            </setting>
            <setting name="IntegratedSecurity" serializeAs="String">
                <value>True</value>
            </setting>
            <setting name="InvoiceFolder" serializeAs="String">
                <value>Rechnungsausgang</value>
            </setting>
            <setting name="TaxFolder" serializeAs="String">
                <value>Steuer</value>
            </setting>
            <setting name="TemplatePath" serializeAs="String">
                <value>P:\Casa IT\Dokumente\Vorlagen\Rechnung.dot</value>
            </setting>
            <setting name="InvoicePath" serializeAs="String">
                <value>P:\Casa IT\Dokumente\Rechnungen\</value>
            </setting>
            <setting name="CustomerFolder" serializeAs="String">
                <value>\Geschäftlich\Firmenkunden</value>
            </setting>
            <setting name="LibraryPath" serializeAs="String">
                <value>E:\Casa IT\CRM\bin\</value>
            </setting>
        </CRM.Properties.Settings>
    </userSettings>
</configuration>

mit folgendem code erhalte ich zwar allgemeine infos zur config:


config.SectionGroups["userSettings"]

aber ich finde in der klasse configuration einfach keine properties oder methoden, um den wert eines settings auszulesen.

kann mich von euch jemand erleuchten?

02.12.2006 - 22:13 Uhr

hey!
wir reden aneinander vorbei!

nochmal: auch ohne referenzierung der System.Configuration.dll ist der Namensraum System.Configuration bereits bekannt.
Ich kann also folgendes machen:

using System.Configuration;

ohne die referenz zu haben

also gibts auch ( keine compilerfehlermeldung!

und deshalb nochmal die frage:
woran erkennt man also in diesem fall, dass die referenz immer noch nötig ist?

02.12.2006 - 21:57 Uhr

hi alter pflanzenfresser,

erst hab ich gedacht, du willst mich auf den arm nehmen, aber du hast tatsächlich recht... 😦

woran erkennt man das denn in diesem fall?

da der namespace nämlich auch OHNE die refenz auf die assembly bereits bekannt ist, bin ich gar nicht erst auf die idee gekommen, dass die noch fehlen könnte...

02.12.2006 - 20:50 Uhr

hallo leute,

ich versuche, mit einer als dll zur laufzeit geladenen klasse die settings der übergeordneten anwendung "auszulesen".

die hilfe und auch hier das forum nennt zum thema die statische klasse ConfigurationManager im namensraum System.Configuration.

die gibt es bei mir nicht!

ich hab bloß ConfigurationSettings und der compiler meldet mir hier, dass sie obsolet sei und schlägt ebenfalls den ConfigurationManager vor.

ja wo zum henker isser denn nu???

jemand ne idee, wo ich hier auf der leitung steh?
(reimt sich sogar 🙂)

gruß
ron

24.11.2006 - 14:29 Uhr

hi norman_timo,

bin inzwischen schon ein bisschen weiter:
die ränder werden nur im designmodus nicht eingehalten; zur laufzeit klappt es wunderbar.

(daher ist deine vermutung zwar gut, aber leider nicht zutreffend; das war auch das erste, was ich gecheckt habe 😉

im augenblick kann ich mit der lösung so leben; wäre natürlich dennoch interessant,welches ereignis man überschreiben muss, um auch im entwurfsmodus die korrekte darstellung zu erhalten...

danke jedenfalls

gruß
ron

24.11.2006 - 12:23 Uhr

hi norman_timo,

so ein property hatte ich auch schon "in betrieb", das somit das Padding der groupBox zugänglich macht:

      public Padding InnerPadding
      {
         get { return groupBox.Padding; }
         set { groupBox.Padding = value; }
      }

das funktioniert leider gar nicht: effekt = 0 😦

24.11.2006 - 11:45 Uhr

hallo zusammen,

ich habe ein eigenes control, das von Panel erbt und als inneres element eine groupbox mit einer checkbox kombiniert, um das gesamte panel "abschalten" und verstecken zu können (siehe bild).

das problem, das ich einfach nicht in den griff bekomme ist, dass untergeordnete elemente innerhalb dieses panels den gesamten bereich des Panels ausfüllen, wenn ich das docking bspw. auf Fill setze: obwohl die Controls-Kollektion auf die Controls der innenliegenden GroupBox verweist.
anders ausgedrückt werden die ränder der groupbox dabei mit übermalt.

Jemand eine idee ?

thanx,
ron

ps:
die lösung von : [gelöst] Eigener Border - ChildControls auf Abstand halten...
hat übrigens nicht geholfen

nachstehend der code


using System;
using System.ComponentModel;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Diagnostics;

namespace CCL.Common
{

   /// <summary>
   /// A checkable groupbox offering hiding/disabling of its elements and frame color and gradient background features
   /// </summary>
   [ToolboxBitmapAttribute("E:\\Casa IT\\CCL\\Ressources\\CheckedPanel.bmp")]
   public class CheckedPanel : Panel
   {

   // ePresentationMode
      /// <summary>
      /// Styles of how the unchecked panel presents its controls
      /// </summary>
      public enum ePresentationMode
      {
         /// <summary>
         /// Animates opening and closing movements leaving only the checkbox visible
         /// </summary>
         Close, 
         /// <summary>
         /// Cuts the box and leaves only the checkbox visible
         /// </summary>
         Hide, 
         /// <summary>
         /// Leaves the groupbox untouched but disables all inside controls
         /// </summary>
         Disable
      }

   #region Members
      private  CheckBox          checkBox;
      private  GroupBox          groupBox;
      private  int               openHeight;
   #endregion

   #region Property-bound members
      protected ePresentationMode   _PresentationMode;
      protected bool                _Checked;
   #endregion

   #region Properties
   // CheckboxText
      ///<summary>
      ///Gets or sets the text of the internal checkbox
      ///</summary>
      ///<remarks>Value must be between 0 and 1</remarks>
      [
      Description("Gets or sets the text of the internal checkbox"),
      Category("Appearance"),
      ]
      public string CheckboxText
      {
         get { return groupBox.Text; }
         set { groupBox.Text = "     " + value.Trim();}
      }

      public virtual new ControlCollection Controls
      {
         get { return groupBox.Controls; }
      }

      public ePresentationMode PresentationMode
      {
         get { return _PresentationMode; }
         set { _PresentationMode = value; }
      }

   // Checked
      ///<summary>
      ///Gets or sets the value of the internal checkbox
      ///</summary>
      ///<remarks>Value must be between 0 and 1</remarks>
      [
      DefaultValue(typeof(bool), "true"),
      Description("Gets or sets the value of the internal checkbox"),
      Category("Appearance"),
      ]
      public bool Checked
      {
         get { return _Checked; }
         set 
         { 
            _Checked = value; 
            checkBox.Checked = _Checked;
         }
      }

   #endregion

   #region .ctor(s)
      public CheckedPanel() : base()
      {
         SetStyle( ControlStyles.OptimizedDoubleBuffer | ControlStyles.UserPaint |
                   ControlStyles.ResizeRedraw | ControlStyles.AllPaintingInWmPaint, true );
         Padding = new Padding(1);

      // groupBox
         groupBox = new GroupBox();
         groupBox.Padding = new Padding(3, 80, 3, 3);
         groupBox.Location = new Point(Padding.Left, Padding.Top);
         groupBox.Dock = DockStyle.None;
         groupBox.Size = new Size(Width - Padding.Left -Padding.Right, Height - Padding.Bottom - Padding.Top);
         groupBox.Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Right | AnchorStyles.Bottom;
         groupBox.Name = "innerPanel";
         groupBox.TabIndex = 0;
         groupBox.BackColor = Color.Transparent;
         base.Controls.Add(groupBox);

      // checkBox
         checkBox = new CheckBox();
         checkBox.AutoSize = true;
         checkBox.Location = new Point(8, Padding.Top);
         checkBox.Name = "checkBox";
         checkBox.TabIndex = 2;
         checkBox.Text = "";
         checkBox.Checked = Checked;
         checkBox.CheckedChanged += new EventHandler(Internal_CheckBox_CheckedChanged);
         checkBox.UseVisualStyleBackColor = true;
         base.Controls.Add(checkBox);
         CheckboxText = this.Name;

         Checked = true;
     }

   #endregion

   #region Events
      protected override void CreateHandle()
      {
         base.CreateHandle();
         if (!DesignMode)
         {
            openHeight = Height;
            Present();
         }
      }

      protected override void OnResize(EventArgs e)
      {
         base.OnResize(e);
         if (DesignMode) 
         {
            openHeight = Height;
         }
      }

      private void Present()
      {
      // sync controls in Disable-mode
         if (!DesignMode) 
         {
            Control targetControl = this;
            switch (this.Dock)
            {
               case DockStyle.Bottom:
               case DockStyle.Top:
               case DockStyle.None:    targetControl = this;
                                       break;

               case DockStyle.Fill:
               case DockStyle.Left:
               case DockStyle.Right:   targetControl = groupBox;
                                       groupBox.Dock = (Checked) ? DockStyle.Fill : DockStyle.Top;
                                       break;
            }

            switch (_PresentationMode)
            {
               case ePresentationMode.Hide: // no animation implemented yet
               case ePresentationMode.Close:    targetControl.Height = (Checked) ? openHeight + Padding.Top : 15 + Padding.Top;
                                                break;

               case ePresentationMode.Disable:  foreach (Control ctrl in Controls)
                                                {
                                                   ctrl.Enabled = Checked;
                                                }
                                                checkBox.Enabled = true;
                                                break;
            }
         }
      }

      private void Internal_CheckBox_CheckedChanged(object sender, EventArgs e)
      {
         _Checked = checkBox.Checked;
         Present();
      }

      protected override void OnControlAdded(ControlEventArgs e)
      {
         try 
            { e.Control.BackColor = Color.Transparent; } 
            catch {}

         base.OnControlAdded(e);
         e.Control.BringToFront();
      }
   #endregion

   }
}

09.11.2006 - 17:16 Uhr

hi zusammen,

meine anwendung lädt zahlreiche dll´s zur laufzeit; diese sind ebenfalls in eigenen c# projekten erstellt und stellen views innerhalb der "mutteranwendung" dar.

wie kann ich zur laufzeit aus der dll heraus auf die settings der anwendung zugreifen, die diese dll geladen hat?

mit settings komme ich ja nur an die "eigenen" settings der dll dran.

ConfigurationSettings.AppSettings.Keys ist im debugger leer, scheint also auch nicht der richtige weg zu sein.

hat jemand irgendwelche ideen?

danke vorab

ron

29.10.2006 - 08:55 Uhr

yo, hatte mich verguggt:

die knoten sind natürlich doch von ausserhalb der InitializeComponent()-Methode ansprechbar:

tvwNavigator.Nodes["Knotenname"].Tag = ...

war also ein user problem 😉

danke jedenfalls

gruß
ron

28.10.2006 - 23:15 Uhr

hi zusammen,
habe das thema im rahmen eines aktuellen projektes nochmal aufgegriffen und lande bei folgendem problem:

ich will im tag der baumknoten etwas speichern und zwar einen wert einer enum und das schon im constructor des formulares.

das problem: der designer legt die knoten einer treeview gar nicht als private klassenvariablen an, sondern nur als methodenlokale variablen in InitializeComponent:
das sieht etwa so aus:


private void InitializeComponent()
{
   ...

   System.Windows.Forms.TreeNode treeNode1 = new System.Windows.Forms.TreeNode("Mitarbeiter     ", 3, 2);
   System.Windows.Forms.TreeNode treeNode2 = new System.Windows.Forms.TreeNode("Banken     ", 10, 11);
   System.Windows.Forms.TreeNode treeNode3 = new System.Windows.Forms.TreeNode("Notare     ", 12, 12);
   treeNode1.ImageIndex = 3;
   treeNode1.Name = "tndMitarbeiters";
   treeNode1.SelectedImageIndex = 2;
   treeNode1.Text = "Mitarbeiter     ";

...usw.

   this.tvwNavigator.Nodes.AddRange(new System.Windows.Forms.TreeNode[] {
      treeNode1,
      treeNode2,
      treeNode3});
   ...
}

wenn ich jetzt einem knoten ein tag zuweisen möchte, müsste ich das ebenfalls in InitializeComponent tun; das killt aber der designer natürlich nach jedem späteren eingriff in die knotenstruktur per VisualStudioDesigner.

andererseits geht von ausserhalb der befehl

tvwNavigator.Nodes["Mitarbeiter"].Tag = eSubview.Mitarbeiter

auch nicht, weil "Mitarbeiter" nicht als Index für den Knoten eingerichtet wird und damit der Knoten eigentlich nach aussen hin unauffindbar wird, sobald InitializeCompinent abgearbeitet ist.

Eigentlich will ich aber nicht auf den Comfort des visuellen Designers verzichten, weil ich sonst die ganzen Bildindizes etc. manuell codieren muss.

jemand ne idee?

thanx

ron

27.08.2006 - 11:08 Uhr

hi leute,

mal ne profane frage für vs2005:
wenn man im codeeditor mit dem cursor kurz vor einer öffnenden klammer steht, hebt er ja sehr schön den abschliessenden klammerpartner hervor.

kann man den auch direkt anspringen mit einer tollen tastenkombination?

thanx

ron

27.08.2006 - 11:03 Uhr

hi folks,

danke für eure antworten.

@borg: initialisierungsvariablen hab´ ich im jahre 1998 unter vba verwendet 😉 ich dachtehalt, es gäbe vielleicht für mein problem einen strategisch besseren punkt der codeplatzierung, um solche "profi"-variablen zu vermeiden. hab´s jetzt aber so gemacht und funktioniert. es kommt mir nur immer noch ein bisschen unprofessionell vor, eine variable initializing im konstruktor auf true zu setzen und am ende des CreateHandle wieder auf false...

@herbivore: klar, danke, aber ich wollte nicht den eventhandler auch noch überschreiben; SelectedValueChanged erfüllt den zweck; oder wolltest du auf etwas hinaus, das mir über die eventArgs von SelectedValueChanged nicht bekannt ist...?

schönen sonntag noch

ron

26.08.2006 - 12:47 Uhr

hallo,

habe nachstehendes Problem:

Eine von Panel abgeleitete Klasse BusinessObjectPanel soll darauf reagieren, wenn der Benutzer in den enthaltenen Steuerelementen (in diesem Fall z.B. einer Combobox) Veränderungen vornimmt.

Die Combobox ist ebenfalls ein eigenes Control, geerbt von ComboBox heisst sie DropDownBox und ist an eine Datenquelle gebunden.

Die Zuweisung der EventHandler erfolgt in der überschriebenen Methode CreateHandle des BusinessObjectPanel:

 
protected override void CreateHandle()
{
   base.CreateHandle();

// Assign control events
   if (!DesignMode) AssignEvents(this);
}

Der Verbindungsaufbau der DropDownBox mit der Datenquelle erfolgt in der überschriebenen Methode CreateHandle der DropDownBox.

 
protected override void CreateHandle()
{
   base.CreateHandle();
// At runtime fill combobox with data from the given catalog
   if ((!DesignMode) && (_Catalog != null) && (_Catalog != ""))
   {
      SQLBroker sqlBroker = SQLBroker.GetInstance();
      DataSource = sqlBroker.GetFilteredBindingSource("Catalogs", "Category = '" + _Catalog + "'" ); 
      DropDownStyle = ComboBoxStyle.DropDownList;
   }
}

Das Problem ist nun, dass bei der Zuweisung der DataSource im CreateHandle der DropDownBox das Ereignis SelectedValueChanged bereits gefeuert wird und dadurch die Folgeverarbeitung im übergeordneten BusinessObjectPanel stattfindet. In diesem Fall hat das ja aber nicht der Benutzer gemacht, sondern es handelt sich hier ja noch um eine Initialisierungsphase, bei der diese Folgeverarbeitung noch gar nicht stattfinden soll.

Wann und wo muss ich die DataSource der DropDownBox zuweisen, und wann und wo kann ich die Ereignisverarbeitung der untergeordneten Controls dem BusinessObjectPanel zuweisen, damit diese nicht schon bei der Komponentenerstellung gefeuert werden?

danke für Eure Hilfe

ron

PS:
CreateControl() im Konstruktor bereits aufzurufen um CreateHandle zu forcieren, hat zwar insofern zum gewünschten Erfolg geführt, dass die Ereignisse nicht mehr gefeuert wurden, aber leider auch dazu, dass die Datenverbindung zur Datenquelle nicht mehr rechtzeitig (oder zu früh?) aufgebaut wurde; jedenfalls enthält die Combobox dann zur Laufzeit plötzlich keine Inhalte mehr.

10.08.2006 - 10:45 Uhr

hi zusammen,
wir sind begeisterte nutzer des team foundation servers und haben nur folgendes kleine problem:

die über den tfs verwaltete solution hat mehrere projekte, die voneinander abhängig sind, das heisst projekt B verweist auf kompilate von projekt A etc.

wenn entwickler e1 die solution eincheckt und entwickler e2 getlatestversion macht, erhält er die verweispfade von e1 und die stimmen auf seiner festplatte ja nicht unbedingt mit der struktur von e1 überein.

serverbasierte verweise sollen vermieden werden, damit entwickler auch offline (sprich: zuhause) lokal an der solution arbeiten können.

wie löst man dieses problem?

danke für eure hilfe.

ron

09.08.2006 - 15:47 Uhr

großartig!

danke!

09.08.2006 - 13:17 Uhr

hi zusammen,

wie kann ich herausfinden, welche nummer eine warnung der ide hat, um sie dann in der liste der zu unterdrückenden nummern einzutragen?

ich bekomme für viele code stellen die warnung "Der XML-Kommentar für den öffentlich sichtbaren .... fehlt"

Wenn ich diese warnung unterdrücken will, muss ich ihre nummer kennen. ich finde nirgendwo eine liste der fehlernummern oder warnungsnummern.

weiss jemand von euch etwas?

gruß

ron

29.07.2006 - 19:09 Uhr

hi hotzenplotz

ich denke auch, wie herbivore sagt, dass der einfachste weg ist, die images der nodes zu nehmen.

der andere weg wäre, eine eigene klasse von treenode zu vererben; das dürfte aber der aufwendigere weg sein. da der treeview sicher ein string als anzeigetext der knoten erwartet, wäre es sicher nicht einfach damit getan, in der eigenen treenodeklasse das property text zu überschreiben und stattdessen eine ganze checkbox zurückzugeben 😉
also würde man zusätzlich sicher noch eine eigene treeview klasse schreiben müssen, die solche checktreenodes verarbeiten kann...

soweit meine gedanken dazu.

wäre aber ma ein interessanten projektchen 😉

viel erfolg
ron

28.07.2006 - 20:09 Uhr

also ich hab ja KEINE ahnung worum hier gerade gerangelt wird, weise aber nochmal auf meine antwort hin, die funktioniert nämlich auch... =)

27.07.2006 - 13:30 Uhr

hi kovu

versuch mal

 
public Form1()
{
   InitializeComponent();
   TopLevel = false;
}

vorm zeigen aus dem eventhook musst du toplevel aber wieder auf true setzen
🙂

27.07.2006 - 13:24 Uhr

hi henma,

die fragestellung ist zwar ein bissi unpräzise, aber ich denke mal, du wirst unter dem stichwort rekursion und treeview in der suche einiges im forum finden.

sinngemäß würde man eine methode BaueZweig() schreiben, die sich selbst wieder aufruft, wenn zum Datensatz des Knotens Detaildatensätze bestehen:


private void BaueZweig(TreeNode mutterKnoten)
{
   DataRow[] records = ... // irgendeine methode, detaildatensätze des knotens zu ermitteln
   foreach (DataRow row in records )
   {
      mutterKnoten.Nodes.Add(irgendEinSchluessel, einAnzeigeText);
      TreeNode kindKnoten = mutterKnoten.Nodes[irgendEinSchluessel];
      BaueZweig(kindKnoten);
   }
}

gruß
ron

27.07.2006 - 13:09 Uhr

hi acid,

doublebuffering hilft hier weder auf control ebene noch auf formularebene.

ich glaube auch nicht, dass doublebuffering überhaupt für den ENTWURFSMODUS im VisualStudio Designer greift; ich hatte das eher laufzeitorientiert verstanden.

ps:
wenn ich in densuchergebnissen etwas brauchbares gefunden hätte, hätte ich hier nicht gepostet 😜

27.07.2006 - 11:05 Uhr

hallo c# helden,

ich habe einen groupbox-nachkommen entwickelt, der im Kopf eine checkbox anzeigt. ziel ist, dass das abschalten der checkbox zu wahlweise deaktivierung aller in der groupbox enthaltenen controls führt oder die groupbox sogar bis auf die anzeige der checkbox verkleinert (also sinngemäß: geschlossen) wird.
ausserdem verfügt die groupbox über farbverlaufsfähigkeiten in verschiedenen modi, die über properties einstellbar sind.

der code ist nachstehend und funktioniert prima.

es gibt aber ein kleines problem: verwende ich mehrere (z.B. drei) CheckedGroupBox elemente in einem formular, werden nach jeder neuen selektion mit der maus innerhalb des formulares im designer die CheckedGroupBoxes nacheinander immer wieder neu gezeichnet. das kann minutenlang so gehen und ich sehe den fehler nicht, zumal zur laufzeit dieser effekt nicht auftriitt.

ich habe das problem soweit lokalisiert, dass es mit der methode OnPaintBackground und den dort implementierten Farbverlaufsfähigkeiten zu tun haben muss.

hat jemand von euch eine idee?
zur belohnung habt ihr ja die tolle komponente 😉

danke vorab für jeden tip!

gruß

ron


/*———————————————————————————————————————————————————————————————————————————————————————————————————————————————————*/
/* CheckedGroupBox                                                                                                   */
/*———————————————————————————————————————————————————————————————————————————————————————————————————————————————————*/
/*                                                                                                                   */
/*                                                                                                                   */
/*———————————————————————————————————————————————————————————————————————————————————————————————————————————————————*/
// Created  :  26.07.2006
// Author   :  cr
// Modified :  
/*———————————————————————————————————————————————————————————————————————————————————————————————————————————————————*/
// Comments / ToDo:
//    
/*———————————————————————————————————————————————————————————————————————————————————————————————————————————————————*/
using System;
using System.ComponentModel;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Diagnostics;

namespace Casa.CCL
{

   /// <summary>
   /// A checkable groupbox offering hiding/disabling of its elements and frame color and gradient background features
   /// </summary>
   [ToolboxBitmapAttribute("E:\\CAF\\Codes\\Component Library\\Resources\\CheckedPanel.bmp")]
   public class CheckedGroupBox : GroupBox
   {
   // ePresentationMode
      /// <summary>
      /// Styles of how the unchecked panel presents its controls
      /// </summary>
      public enum ePresentationMode
      {
         /// <summary>
         /// Cuts the box and leaves only the checkbox visible
         /// </summary>
         Close, 
         /// <summary>
         /// Animates opening and closing movements leaving only the checkbox visible
         /// </summary>
         Hide, 
         /// <summary>
         /// Leaves the groupbox untouched but disables all inside controls
         /// </summary>
         Disable
      }

   // eGradientStyle
      /// <summary>
      /// A style for the gradient
      /// </summary>
      public enum eGradientStyle
      {
         /// <summary>
         /// Gradient is bicoloured from background color to gradient color
         /// </summary>
         Gradient, 
         /// <summary>
         /// Gradient is triangular going from background color to gradient color and back again
         /// using the applied gradient mode
         /// </summary>
         Triangular
      }

   #region Members
      private  CheckBox          checkBox;
      private  int               openHeight;
   #endregion

   #region Property-bound members
      protected ePresentationMode   _PresentationMode;
      protected bool                _Checked;
      protected float               _GradientScale;
      protected eGradientStyle      _GradientStyle;
		protected Color               _GradientColor; 
		protected Color               _BaseColor;
      protected LinearGradientMode  _GradientMode;
   #endregion

   #region Properties
      public override string Text
      {
         get { return base.Text; }
         set 
         { 
            base.Text = "     " + value.Trim();
         }
      }

      public ePresentationMode PresentationMode
      {
         get { return _PresentationMode; }
         set { _PresentationMode = value; }
      }

    //Checked
      ///<summary>
      ///Gets or sets the value of the internal checkbox
      ///</summary>
      ///<remarks>Value must be between 0 and 1</remarks>
      [
      DefaultValue(typeof(bool), "true"),
      Description("Gets or sets the value of the internal checkbox"),
      Category("Appearance"),
      ]
      public bool Checked
      {
         get { return _Checked; }
         set 
         { 
            _Checked = value; 
            checkBox.Checked = _Checked;
         }
      }

   // GradientScale
      /// <summary>
      /// Gets or sets the scale of the gradient
      /// </summary>
      /// <remarks>Value must be between 0 and 1</remarks>
      [
      DefaultValue(typeof(float), "1"),
      Description("An intensity value for the gradient between 0 and 1"),
      Category("Appearance"),
      ]
      public float GradientScale
      {
         get { return _GradientScale; }
         set 
         {
            if (value > 1) value = 1;
            _GradientScale = value; 
				Invalidate();
         }
      }

   // GradientStyle
      /// <summary>
      /// Gets or sets the gradient style for the panel
      /// </summary>
		[
		DefaultValue(typeof(eGradientStyle),"Gradient"),
		Description("Gradient Style (gradient or triangular)"),
		Category("Appearance"),
		]
		public eGradientStyle GradientStyle
		{
			get { return _GradientStyle; }
			set
			{
				_GradientStyle = value;
				Invalidate();
			}
		}

	// GradientColor
      /// <summary>
	   /// Gets or sets the gradient color 
	   /// </summary>
      [
      DefaultValue(typeof(Color), "White"),
      Description("The gradient color into which the back color will be merged."),
      Category("Appearance"),
      ]
		public Color GradientColor
		{
			get { return _GradientColor; }
			set
			{
				_GradientColor = value;
				Invalidate();
			}
		}

	// BaseColor
      /// <summary>
	   /// Gets or sets the gradient color 
	   /// </summary>
      [
      DefaultValue(typeof(Color), "190;205;205"),
      Description("The base color from which the back color will be merged."),
      Category("Appearance"),
      ]
		public Color BaseColor
		{
			get { return _BaseColor; }
			set
			{
				_BaseColor = value;
				Invalidate();
			}
		}

   // GradientMode
      /// <summary>
      /// Gets or sets the gradient mode for the panel
      /// </summary>
		[
		DefaultValue(typeof(LinearGradientMode),"ForwardDiagonal"),
		Description("Gradient directional modes"),
		Category("Appearance"),
		]
		public LinearGradientMode GradientMode
		{
			get { return _GradientMode; }
			set
			{
				_GradientMode = value;
				Invalidate();
			}
		}

   #endregion

   #region .ctor(s)
      public CheckedGroupBox() : base()
      {
         SetStyle(ControlStyles.UserPaint, true);
         _Checked = true;
         _PresentationMode = ePresentationMode.Disable;

      // checkBox
         checkBox = new CheckBox();
         checkBox.AutoSize = true;
         checkBox.Location = new System.Drawing.Point(7, 0);
         checkBox.Name = "checkBox";
         checkBox.Size = new System.Drawing.Size(80, 17);
         checkBox.TabIndex = 0;
         checkBox.Text = "";
         checkBox.Checked = Checked;
         checkBox.CheckedChanged += new EventHandler(Internal_CheckBox_CheckedChanged);
         checkBox.UseVisualStyleBackColor = true;
         Controls.Add(checkBox);
         Text = "";

      }
   #endregion

   #region Events
      protected override void InitLayout()
      {
         base.InitLayout();
         openHeight = Height;

         if (!Checked) Present();

      }

      protected override void OnPaintBackground(PaintEventArgs e)
      {
         base.OnPaintBackground(e);
         Rectangle rect = new Rectangle(0, 0, this.ClientRectangle.Width, this.ClientRectangle.Height);
         if ((rect.Width > 0) && (rect.Height > 0))
         {
            using (LinearGradientBrush brush = new LinearGradientBrush(rect, _BaseColor, _GradientColor,  _GradientMode))
            {
               if (_GradientStyle == eGradientStyle.Triangular)
                  brush.SetBlendTriangularShape(.5f, _GradientScale);
               e.Graphics.FillRectangle(brush, rect);
            }
         }
      }

      private void Present()
      {
      // sync controls in Disable-mode
         if (!DesignMode)
         {
            switch (_PresentationMode)
            {
               case ePresentationMode.Close:    Height = (Checked) ? openHeight : 15;
                                                break;

               case ePresentationMode.Hide:
                                                break;

               case ePresentationMode.Disable:  foreach (Control ctrl in Controls)
                                                {
                                                   ctrl.Enabled = Checked;
                                                }
                                                checkBox.Enabled = true;
                                                break;

            }
         }
      }

      private void Internal_CheckBox_CheckedChanged(object sender, EventArgs e)
      {
         _Checked = checkBox.Checked;
         switch (_PresentationMode)
         {
            case ePresentationMode.Close:    Height = (Checked) ? openHeight : 15;
                                             break;

            case ePresentationMode.Hide:
                                             break;

            case ePresentationMode.Disable:  foreach (Control ctrl in Controls)
                                             {
                                                ctrl.Enabled = Checked;
                                             }
                                             checkBox.Enabled = true;
                                             break;

         }
      }

   #endregion

   }
}


21.04.2006 - 11:30 Uhr

hi zusammen,

ich habe in meiner aktuellen solution (mit vielen projekten) das problem, dass ich vom debugger eine "Datei nicht gefunden"-exception bekomme, wenn ich bei den per verweis eingebundenen bibliotheken Lokale Kopie auf false setze.

ist das so gedacht?

ich will ja zum beispiel bestimmte bibliotheken, die ich in allen projekten brauche ja nicht mehrfach auf meinen rechner verteilen, sondern immer DIE EINE version verwenden, die gerade gültig ist.

oder habe ich hier einen denkfehler?

danke für eure hilfe
ron

18.04.2006 - 08:47 Uhr

hi ishildur,

also, wenn du dort eine .net 2.0 anwendung von dir laufen lässt, kannst du auch auf datenbanken aller möglichen formate zugreifen. die zugriffstreiber können ja ggf. über das setup-programm mit verteilt werden.

sqlexpress 2005 ist ausserdem kostenlos

und die access runtime ist auch weiterverteilbar, wenn es unbedingt mdb dateien sein müssen (aber wie gesagt: ich glaube, die access treiber können bestandteil deines setups sein)

gruß
ron

17.04.2006 - 14:02 Uhr

hi cap,

du brauchst es gar nicht so kompliziert zu machen.

jedes steuerelement besitzt eine eigenschaft ContextMenuStrip.
wenn du deinem formular ein contextMenuStrip hinzufügst, und der eigenschaft ContextMenuStrip deiner listbox dieses contextmenustrip zuweist, macht c# den rest automatisch.

den eventhandler brauchst du nicht. kontextmenü heisst ja ins deutsche übersetzt "menü, das erscheint, wenn der benutzer die rechte maustaste drückt" 😉

gruß

ron

17.04.2006 - 10:32 Uhr

hey ronny

es ist definitiv immer am sinnvollsten, sowenig datenbanken wie möglich zu haben.

der theorie nach ist es ja so: EIN unternehmen hat meist EIN geschäftsgebiet und alle daten, die dieses unternehmen sammelt, sollten auch mit DIESEM geschäftsgebiet zusammenhängen. damit hängen sie natürlich auch MITEINANDER zusammen und deshalb sollte ein unternehmen auch nur EINE datenbank haben.

dabei vergessen wir für einen kleinen augenblick natürlich einfach mal, was im laufe der jahre so "historisch gewachsen" ist 😉

ausserdem hättest du ja dein verknüpfungsthema auch damit erschlagen, nur EINE datenbank zu haben und deren modell bei der migration gleich mit zu bereinigen...

frohe ostern

ron

15.04.2006 - 10:07 Uhr

hi rainbird,

die treeview habe ich auch gebaut. das ist natürlich wirklich nicht schwer.
mir geht es aber für meine zielgruppe in der tat darum, nicht outlook-ähnliche funktionalität bereitzustellen, sondern das outlook wirklich zu integrieren.

klar, alles was du sagst, ist richtig, aber das axvwctl bietet eben outlook als ganzes an, inklusive kontextmenüs, filter, etc.

das eventhandling klappt sogar, wenn ich mich in die folderevents einklinke und dann aber ein zusätzlich geöffnetes outlook zum erstellen oder löschen von items benutze.

also, ich kann bisher eigentlich noch nichts nachteiliges zu dessen verwendung sagen.

gruß

ron

15.04.2006 - 00:30 Uhr

hi dragon,

hab´jetzt mal deine idee implementiert und bin zu folgender korrektur gekommen:

 
protected override void OnPaint(PaintEventArgs e)
{
   base.OnPaint(e);
   e.Graphics.DrawRectangle(new Pen(new SolidBrush(_BorderColor)), 
      e.ClipRectangle.Left, e.ClipRectangle.Top, 
      e.ClipRectangle.Width-1, e.ClipRectangle.Height-1);
}

ansonsten gibt´s den rahmen nur links und oben

danke nochmal
gruß
ron

14.04.2006 - 11:31 Uhr

ausserdem gibt es seit heute so lustige einblendeffekte, wenn man eine forenseite betritt...

sehr edel!

ich fühl mich wieder mal ein stück mehr zuhause hier <<LOB>>

gruß

ron

13.04.2006 - 08:05 Uhr

hallo rainbird,

wenn man nicht das axviewctl für outlook nimmt, wie bettet man denn outlook sonst in windows forms anwendungen ein???

gibt´s da was, das ich nicht weiss?

ron

12.04.2006 - 11:24 Uhr

hi suamikim

habe mal etwas ähnliches in vb und sql schreiben müssen.

die kalenderwoche 53 existiert dann, wenn der 1. januar hinter den donnerstag rutscht, also der größere teil der woche noch vom alten jahr bestimmt wird.

hier die codes.

Public Function KW(Optional aDate As Date = 0) As Byte
' Liefert die Kalenderwoche des angegebenen/aktuellen Datums

Dim doY As Integer
Dim dt As Date
Dim result As Byte

' Wenn kein Datum angegeben, dann vom aktuellen Datum ausgehen
If aDate = 0 Then
dt = Date
doY = DayOfYear(Date)
Else
dt = aDate
doY = DayOfYear(aDate)
End If

' Folgendes Konstrukt sorgt für Teilbarkeit des Jahrestages durch 7
doY = doY - (1 + (WeekDay(dt, vbMonday) - WeekDay(DateValue("01.01." & Year(dt)), vbMonday)))

' Woche berechnen:
result = doY / 7

' Korrektur, wenn der 1. Januar auf einen Tag nach Donnerstag fiel
If (WeekDay(DateValue("01.01." & Year(dt)), vbMonday) > 4) Then
If (result = 0) Then result = KW(CDate("31.12." & Year(dt) - 1))
Else
' Korrektur, wenn das Jahr 53 Wochen hat
If (WeekDay(DateValue("31.12." & Year(dt)), vbMonday) < 4) Then
result = result
Else
result = result + 1
End If
End If

KW = iif(result = 0, 1, result)

End Function
'—————————————————————

und als SQL funktion

CREATE FUNCTION dbo.udf_ISOKW(@date dateTime = 0)
RETURNS tinyInt
AS BEGIN

declare @result tinyInt
declare @weekday tinyInt
declare @change int

SET @change = 0

SELECT @weekday = DATEPART(weekday, 'Jan, 1 ' + CAST(DATEPART(year, @date) AS CHAR(4)))

IF @weekday > 5 SET @change = -1

SELECT @result = DATEPART(week, @date) + @change

return @result

END

12.04.2006 - 11:09 Uhr

hallo,

für alle die künftig mit dem problem zu kämpfen haben, hier die inzwischen (endlich!) gefundene lösung:

durch den code

 
fld = nameSpace.GetDefaultFolder(OL.OlDefaultFolders.olFolderCalendar);
fld.Items.ItemAdd += new OL.ItemsEvents_ItemAddEventHandler(Items_ItemAdd);

erfolgt eine zuweisung des eventhandlers innerhalb des methodenbereichs von frmMain_Load(). beim verlassen dieses scopes wird der eventhandler irgendwann vom GC weggeräumt, was erklärt, warum der eventhandler unvorhersagbar mal geht und ab einem unbestimmbaren zeitpunkt nicht mehr.

die lösung ist, eine eigene klassenlokale variable für die items zu deklarieren und den eventhandler der variablen zuzuweisen:

 
#region Members
   ...
   private OL.Items   olItems;
#endregion

      private void frmMain_Load(object sender, EventArgs e)
      {
         view.Folder = "Kalender";

         setLabelText = new SetLabelTextDelegate(SetLabelText);

         olApplication = new OL.ApplicationClass();
         nameSpace = olApplication.GetNamespace("MAPI");

         fld = nameSpace.GetDefaultFolder(OL.OlDefaultFolders.olFolderCalendar);
         olItems = fld.Items;
         olItems.ItemAdd += new OL.ItemsEvents_ItemAddEventHandler(Items_ItemAdd);
      }


12.04.2006 - 08:42 Uhr

hi haggy,

ich schreibe die errorlogs arbeitsplatz-lokal als komplette eventlogs, d.h. bei mir geht aus dem log der arbeitsplatz und der benutzername ebenfalls hervor.

mein errorhandler schreibt ausserdem in die zeile immer den zeitstempel an den zeilenanfang, dann die fehlermeldung, ggf. noch die aufruferklasse und -methode, aber vielleicht ist das ja in deinem stacktrace schon mit drin.

Beispiel:

12.04.2006, 08:45:20 Session started as \PANDORA\dduck
12.04.2006, 08:45:22 Login to database \SERVER01\PANDORA successful
12.04.2006, 08:45:25 frmDesktop.LoadUserPrefs(): Failed to retrieve username from table USERVIEW
12.04.2006, 08:45:20 Session closed due to prior error

gruß
ron

12.04.2006 - 08:25 Uhr

hallo zusammen,

ich verwende ein outlook view control, um outlook funktionalität in meine anwendung einzubinden.

nachstehender code zeigt exemplarisch, was ich versuchen möchte: wenn über das outlook control neue items erstellt werden (egal, ob das später ein kontakt, eine mail, ein termin etc. ist), möchte ich in meiner anwendung natürlich darüber informiert werden, denn das hohe ziel ist die datensynchronisation.

witzigerweise reagiert der eventhandler Items_ItemAdd(...) nicht immer.
es ist auch nicht vorhersagbar, ob er überhaupt reagiert.

definitiv wird er aber nicht mehr aufgerufen, nachdem ich im angezeigten ordner (hier:kalender) einen termin gelöscht habe und danach einen neuen erstelle. der eventhandler wird einfach nicht mehr aufgerufen.

hier der code:

 
using System;
using System.Windows.Forms;
using OL = Microsoft.Office.Interop.Outlook;
using AxMicrosoft.Office.Interop.OutlookViewCtl;

namespace OLTester
{
   delegate void SetLabelTextDelegate(string text);

   public partial class frmMain : Form
   {
   #region Members
      private OL.NameSpace        nameSpace;
      private OL.Application      olApplication;
      private AxViewCtl           view;
      private OL.MAPIFolder       fld;
      private Label               statusLabel;
      private SetLabelTextDelegate setLabelText;
   #endregion

   #region Methods
      private void SetLabelText(string text)
      {
         statusLabel.Text = ("Neuer Termin: '" + text + "'");
      }
   #endregion

   #region Constructor(s)
      public frmMain()
      {
         InitializeComponent();
         
      // Init view
         view = new AxViewCtl(); 
         ((System.ComponentModel.ISupportInitialize)(view)).BeginInit();
         view.Dock = System.Windows.Forms.DockStyle.Fill;
         view.Enabled = true;
         view.Name = "view";
         ((System.ComponentModel.ISupportInitialize)(view)).EndInit();

         statusLabel = new Label();
         statusLabel.AutoSize = false;
         statusLabel.Text = "Bereit";
         statusLabel.Dock = DockStyle.Bottom;
         this.Controls.Add(view);
         this.Controls.Add(statusLabel);
      }
   #endregion

   #region Event handling
      private void frmMain_Load(object sender, EventArgs e)
      {
         setLabelText = new SetLabelTextDelegate(SetLabelText);
         olApplication = new OL.ApplicationClass();
         nameSpace = olApplication.GetNamespace("MAPI");
         fld = nameSpace.GetDefaultFolder(OL.OlDefaultFolders.olFolderCalendar);
         fld.Items.ItemAdd += new OL.ItemsEvents_ItemAddEventHandler(Items_ItemAdd);
         view.Folder = "Kalender";
      }

      private void Items_ItemAdd(object Item)
      {
         try
         {
            object[] args = new object[1];
            args[0] = ((OL._AppointmentItem)Item).Subject.ToString();
            statusLabel.Invoke(setLabelText, args);
         }
         catch (Exception exc) { MessageBox.Show(exc.Message); }
      }
   #endregion

   }
}


ich bin auch für alle vorschläge offen, ereignisse in outlook an anderer stelle oder über andere techniken abzufangen.

danke vorab

ron

PS:
den umweg über den delegate musste ich auch noch gehen, weil ich sonst unerlaubte threadübergreifende zugriffe auf mein label control gemeldet bekomme.
ist die hier implementierte art der richtige weg? (ist nämlich meine erste Invoke-Implementierung)

09.04.2006 - 12:31 Uhr

wow, tricky question...

eine passende antwort habe ich dazu leider nicht. ich würde das problem aber vermutlich am ehesten angehen, indem ich mich damit beschäftige, wie die IDE zur entwurfszeit mit "den dingen umgeht".

in der letzten dotnetpro gibt es einen schönen artikel darüber, wie man sich selbst einen assistenten schreibt, der sich in die IDE einklinkt (am bsp. eines O/R-Mappers: http://www.dotnetpro.de/articles/onlinearticle1932.aspx).

darin sind einige klassen beschrieben, welche die IDE verwendet, um ihren eigenen aktuellen projektcode und die objekte, die darin enthalten sind, zu manipulieren.

das würde ich als einstieg nehmen. mit diesen kenntnissen ginge es anschliessend ja "nur noch" darum, der IDE den Singleton meiner Connection an allen möglichen stellen wieder anzubieten.

hth
ron

09.04.2006 - 12:05 Uhr

genau herbi,

lass ma los und lächel mal.

mich jedenfalls hat es angesichts des reissackes doch glatt vom stuhl gerissen 😁

09.04.2006 - 12:03 Uhr

hi ishildur,

das ist ein gerechtfertigter einwand.

in der tat muss ich bei meinem konzept oft mehr daten holen, als ich im ersten schritt anzeige. zu diesem zweck verwende ich in solchen fällen den backgroundworker.

ausserdem muss ich sagen, dass mich die verarbeitungsgeschwindigkeit von vs2005 in zusammenhang mit sql 2005 schier umhaut.

Hoffentlich hast du ein interesanntes Icon für die Sanduhr!

um ehrlich zu sein, bin ich in der tat gerade auf der suche nach guten graphiken, s.a. http://www.mycsharp.de/wbb2/thread.php?threadid=17333, allerdings steht dabei eine gute sanduhr nicht so sehr im vordergrund 😁

gruß
ron

09.04.2006 - 11:48 Uhr

hi ishildur,

Nun habe ich ein DataGridView, in welches ich alle 100'000 Personen reinlade,

mach ich auch so

Wenn ich nun auf eine Zeile doppelklicke, dann erscheint ein Dialog mit ausführlichen Information der betreffenden Person.

bei mir auch.

so, und jetzt?

der dialog braucht doch nur auf die tabellen im bestehenden einzigen dataset einen entsprechenden filter zu setzen. in einer datatable geschieht dies über die Methode Select(...), im BindingSource über Filter = "...";

ich verstehe immer noch nicht die notwendigkeit multipler datasets in einer anwendung, ich halte es sogar für bedenklich in verschiedenen datasets gleiche tabellen zu hinterlegen (denn du hast die personen ja jetzt im übersichts-dataset und im detaildialog-dataset). damit die übersicht die änderungen der detailsicht reflektiert, musst du dir die daten jetzt neu abholen. innerhalb des gleichen datasets wäre das nicht nötig: ohne eine weitere codeanweisung zeigt die übersicht unaufgefordert die aktuellen werte, weil sie über die bindingsource an der physisch identischen tabelle des gleichen datasets hängt.

wie gesagt: ein dataset ist ein abbild der datenbank, ggf. inklusive aller beziehungen und integritätsregeln.

ich könnte noch halbwegs verstehen, wenn man kategorisch unterschiedliche datasets bildet, ähnlich den neuen schemas im sql server 2005, sagen wir mal ein dataset für "Bestellwesen", "Vertrieb", "BackOffice", etc., aber selbst hier würde ich immer eher zu EINER datenbank neigen, denn letztlich haben alle informationscontainer (sprich: tabellen) irgendwas miteinander zu tun.

die anzahl der datensätze oder tabellen in einer datenbank ist hier kein argument. ich mache das auch bei einer anwendung mit annähernd hundert entitäten und datenaufkommen mehrerer hunderttausend datensätze so wie oben beschrieben.

gruß

ron

09.04.2006 - 11:10 Uhr

ach so.

Toll !

😁

09.04.2006 - 10:55 Uhr

hi ishildur,

hatte deine frage dann wohl falsch verstanden.

anyway:

weil der Designer es nicht zulässt, dass man vererben kann,

ich habe schon einiges vererbt, was den designer nicht gestört hat. aber per ferndiagnose zu bestimmen, was den designer an deinem dataset stört, ist ein bissi schwierig ohne den code des erben zu kennen.

Was ich nicht so recht verstehe, ist deine Idee mit dem Singleton Wrapper: Ich habe eine MDI - Applikation, da braucht schon jedes MDI - Child sein eigenes DataSet!

vielleicht habe ich ja auch konzeptionell was grundsätzliches falsch verstanden, aber die semantische übersetzung von dataset ist doch "in-memory-datenbank", nicht "in-memory-table".
anders ausgedrückt: in meinen anwendungen existiert jeweils nur ein dataset, aber natürlich mit zahlreichen tabellen (sprich: datatables) darin.

was für ein vorteil hat es, mehrere datasets zu haben?

gruß

ron

09.04.2006 - 10:26 Uhr

hi ishildur,

wenn ich dich richtig verstehe, arbeitest du mit einem typisierten dataset.

ich kann aus eigener erfahrung nur zu untypisierten datasets raten.
warum baust du dir nicht einen singleton sqlwrapper, der das dataset public vorhält und alle abfragen aller objekte abwickelt. weitere öffentliche properties der klasse könnten eine DataTable und eine BindingSource sein.

selbst ohne eine solche hilfsklasse ist es ja auch nur ein drei- bis vierzeiler, daten aus einer datenbank angezeigt zu bekommen.

Der einzige Nachteil untypisierter Datasets ist ja eigentlich nur, dass zur entwurfszeit die datagrids vielleicht nicht ihre spalten zeigen und die formatierung an dieser stelle zunächst etwas aufwendiger ist, aber das könnte man ja umgehen, indem man kurzzeitig die entsprechende tabelle typisiert einbindet und nach erfolgtem design des grids wieder löscht.

gruß
ron

08.04.2006 - 01:36 Uhr

hi haggy,

dass herr schwichtenberg auch als trainer gut ist, kann ich aus eigener erfahrung bestätigen, allerdings habe ich ihn zwei tage von 5 bei einem entwicklercamp als trainer gehabt, von denen 2 tage bei einem anderen trainer schlichtweg umsonst (im sinne von "vergebens") waren.

wenn du´s dir leisten kannst, versuch doch einfach einen der cracks (schwichtenberg, westphal, etc.) zwei tage zu buchen, face to face heisst: knallharte fragestunde, die sich bezahlt macht... 😉

gute kritiken haben übrigens auch koenig-solutions:
http://www.koenig-solutions.com/training/mcsd_training.asp

da kann man sich auch seinen kursinhalt selbst zusammenstellen.
(und ausserdem noch einen blick ueber den europäischen tellerrand hinaus werfen und ne woche urlaub anhängen...)
hatte selbst schon gebucht, musste aber leider wegen zuviel arbeit verschieben.

gruß

ron