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

27.05.2007 - 15:06 Uhr

hi roithi

ein datagridview zeigt die spalten in der reihenfolge der bindingsource an, an die sie gebunden wird, wenn AutoGenerateColumns = true gesetzt ist und zur Laufzeit die Datenbindung des Gitters geändert wird.

Ist das bei dir so? Wenn ja, solltest du AutoGenerateColumns auf false setzen.

htht
ron

25.05.2007 - 07:18 Uhr

hi steven


private ApplicationSettingsBase settings;
...
settings = new MyNamespace.Properties.Settings();

// Bei Anwendungsstart vermutlich:
   settings.Reload();

// Zurücksetzen:
   settings["meinWert"] = MyNamespace.Properties.Settings.Default.meinWert;

// Bei Drücken auf Speichern 
   settings.Save();


hth
ron

25.05.2007 - 07:13 Uhr

hallo pixel,

dass es beim ersten mal überhaupt klappt, ist meiner meinung nach entweder zufall oder rührt von einem (anfangs) definierten zustand der checkboxen her.

tatsache ist: defaults werden vom dataset nicht aus der datenbank übernommen,
die tatsache, dass eine spalte nicht NULL bleiben darf aber sehr wohl.

soll heissen: addnew() muss sich danach selbst darum kümmern, dass defaults erzeugt werden:


DataRowView row = myBindingSource.AddNew();
row["checkBoxSpalte"] = 0; // oder false, je nach typ

bei checkboxen ist das eben besonders auffällig, da sie im nicht eingeschalteten zustand mit databinding vorgaukeln, sie seien abgeschaltet - sie erzeugen aber nicht den wert in der datenbindung, der sich hinter "abgeschaltet" verbirgt.

gruß
ron

23.05.2007 - 08:40 Uhr

Hallo zusammen,

ich hätte gerne Eure Meinung zu obiger Frage.

Hintergrund
Oftmals beinhalten Objekte einander, z.B. eine _TreeView _enthält Nodes.
Das hat zur Folge, dass von einer TreeView aus jeder Knoten ansprechbar ist.
Es heisst aber auch, dass jeder TreeNode den TreeView kennt, in dem er sich befindet. und nicht nur das: er könnte an der TreeView ja durchaus Veränderungen vornehmen.

Frage
Wann folgt man einem solchen Konzept?
Sollte eine Klasse, die so ausgelegt ist, dass sie garantiert in einer anderen Klasse eingebettet wird (egal ob visuell oder nicht) **immer ** ihr übergeordnetes Element kennen?

Was sind hier Eure Pro´s und Contra´s bzw. die Überlegungen, die eine entsprechende Architektur zur Folge haben?

Danke
Ron

23.05.2007 - 08:15 Uhr

hi alex,

du hast ziemlich harte arbeitszeiten 😉

also, folgendes sollte funktionieren:


SELECT 
   c.*,
   isNull(d.Value, f.Value)
FROM 
   CONTRACTS c
      LEFT JOIN CONTRACTDETAILS d ON (c.id = d.id) and (curdate() BETWEEN d.DateFrom AND d.DateTo)
      LEFT JOIN CONTRACTDETAILS f ON (c.id = f.id) and (f.Flag = 2)

der trick besteht in der funktion IsNull(), von der ich allerdings nicht weiss, ob sie von mySQL unterstützt wird (ich komme von MS SQL).
sollte die nicht verfügbar sein, musst du mit einem case in der select klausel arbeiten.

bei nicht existentem datum im gewünschten zeitraum ist d.Value = NULL, deshalb erfolgt die auswertung über die andere detailtabelle (alias f).

du solltest allerdings auch definieren, was passiert, wenn beide datensätze nicht existieren - oder kann das nicht auftreten?

hth,
gruß
ron

22.05.2007 - 17:28 Uhr

hi paul,

die Eigenschaft heisst "IsSelected", ist aber schreibgeschützt.

du musst der treeview das property setzen:

myTreeView.SelectedNode = null; // oder natürlich einen anderen Knoten

hth

ron

22.05.2007 - 17:22 Uhr

hi pixel,


int position = bs.Find(spaltenName, wert);
if (position >=0 ) 
{
   bs.Position = position;
   DataRowView row = (DataRowView)bs.Current;
   MessageBox(row[irgendEineSpalte]);
}

hth
ron

21.05.2007 - 22:55 Uhr

hi Dwaynor,

die instanz der settings kriegen wir mit:


   ApplicationSettingsBase settings = new meinProjektname.Properties.Settings();

danach hat man eine instanz der settings, die nicht mit den Defaults vorbelegt ist.

danach lesen wir bspw. die letzten settings aus der letzten sitzung aus.
das geht mit Reload():


   settings.Reload();

hth
ron

21.05.2007 - 22:46 Uhr

hi pro

zum beispiel mit einer temporären tabelle:


declare @myMax int

drop table #kannweg

select 
   convert(int, 1) as zahl
into #kannweg

insert into #kannweg(
   zahl
)
select 2
union select 3
union select 4

select @myMax = max(zahl) from #kannweg

print @myMax

hth

ron

19.05.2007 - 16:10 Uhr

hi zusammen,

wie verändert man die distanz der einträge zueinander in einer ListView, wenn sie im Zustand View = SmallIcon ist und das Alignment auf Left steht?

OwnerDraw = true und Überschreiben des OnDrawItem hilft mir auch nicht, denn dort ist die Spalte, in der das Item gerade gezeichnet werden soll nicht bekannt.

danke für eure Hilfe,

gruß
ron

16.05.2007 - 10:18 Uhr

zumal ich mir eigentlich nicht vorstellen kann, wozu man die Anzahl verwenden könnte.

wenn nur eines der genannten flags gesetzt ist, wird das auswahlmenü gesperrt, da es ja keine andere zulässige ansicht gibt, die der benutzer jetzt aufrufen könnte.

16.05.2007 - 10:08 Uhr

hi herbivore,

schleifen wollte ich ja eigentlich nicht - ich dacht, es gäbe etwas vorgefertigtes á la Enum.GetDefinedCount(...)

na gut, dann muss es halt so gehen.

16.05.2007 - 09:50 Uhr

ähem,

auch auf die Gefahr hin mich hier als nixnutz zu outen... 😁

wenn ich ein klassenattribut habe, das als flagspeicher dient:


[Flags]
public enum eViewType
{
   Unknown = 0,
   DataGrid = 1,
   InfoCards = 2,
   List = 4
}

public class View
{
   private eViewType viewType;
...
}

kann ich ja mit folgendem Konstrukt ermitteln, ob das Flag x gesetzt ist:


   if ((viewType & eViewType.List) == eViewType.List)
   ...

gibt es auch eine syntaktische möglichkeit herauszubekommen, wie hoch die anzahl der insgesamt gesetzten flags ist?

danke
gruß, ron

16.05.2007 - 09:29 Uhr

hi leute,

schön, dass aus der frage ein so angeregte diskussion entsteht. 😉

ich würde auch dazu neigen, die benötigten eigenschaften (TopLevel war ja nur ein beispiel) in das interface zu packen (herbivores "kein Einkaufswagen" natürlich berücksichtigt)

@friedel:
bei dem beispiel Form -> Control fände ich es durchaus legitim, bei einer solchen implementierung folgendes zu machen:


public class View : Control, IView
{
   public bool TopLevel
   {
      get { return false; }
      set {}
   }
}

und danke an auch alle für eure meinungen

gruß
ron

16.05.2007 - 08:21 Uhr

Hallo zusammen,

ich habe eine Eigenschaft einer Klasse:


private Dictionary<string, eRecordsetView> _AvailableRecordsetContainers;
public Dictionary<string, eRecordsetView> AvailableRecordsetContainers
{
   get { return _AvailableRecordsetContainers; }
   set {_AvailableRecordsetContainers = value; }
}

mit


[Flags]
public enum eRecordsetView
{
   None = 0, 
   DataGrid = 1, 
   InfoCards = 2, 
   List = 4, 
   Custom = 8
}

Im Designer bekomme ich zwar einen Dialog gezeigt, der mir die Auflistung zur Bearbeitung anzubieten scheint, aber leider ist der Schalter zum Hinzufügen eines Elements gesperrt.

Woran kann das liegen?
Wie würde ein eigener Designer hierzu gebaut werden müssen?

Danke,
ron

16.05.2007 - 07:50 Uhr

hi zusammen,

ich hätte gerne eure Meinung zu folgendem Sachverhalt.

Wir haben z.B. eine Schnittstelle:


public interface IView
{
   object SomeThing { get; set;}
...
   void SomeAction();
...
}

Die Implementierung erbt außerdem von Form:


public class View : Form, IView
{
// Implementierung
...
}

Will ich später auf Formulareigenschaften und -methoden des Objekts zugreifen, muss folgende Typumwandlung ran:


IView view = microkernel.GetInstance<IView>();
((Form)view).TopLevel = false;

Meine Frage:
Da man Schnittstellen ja im Hinblick auf ihre spätere Verwendung gestaltet, ist es legitim (oder sogar guter Stil), die benötigten Methoden/Eigenschaften in der Schnittstelle bereits zu nennen, um solches Casting zu umgehen?


public interface IView
{
   bool TopLevel { get; set;}
...
}

Der Compiler akzeptiert ja nun in der obenstehenden Implementierung der Schnittstelle die aufgrund der Vererbung eingeflossenen Methoden/Eigenschaften als Implementierung der Schnittstelle ohne dass man diese explizit vornehmen muss.

Alternativ hätte man ja auch noch die Möglichkeit, die geerbte Klasse als Objekt in den Eigenschaften zu nennen:


public interface IView
{
   Form Form { get; }
...
}

public class View : Form, IView
{
   public Form Form
   {
      get { return (this as Form); }
   }
}

Dann geht:


IView view = microkernel.GetInstance<IView>();
view.Form.TopLevel = false;

Danke für eure Meinung

14.05.2007 - 13:04 Uhr

hi henning,

Kann man irgendwie abfragen, ob ein EventHandler gesetzt wurde?


// Zuweisung
   lil.LinkClicked += new LinkLabelLinkClickedEventHandler(eventHandler);
...
// Zuweisung prüfen:
   if (LinkClicked != null) LinkClicked();

// und was es auch noch gibt:
   EventHandler handler = (EventHandler)Events[meinEvent];
   if (handler != null)
      handler(this, e);


hth,
ron

13.05.2007 - 11:02 Uhr

cool, danke für deine meinung.

schönen (muttertags-!) sonntag noch.

13.05.2007 - 10:36 Uhr

hi herbivore,

also wenn es jemanden gibt, auf dessen antwort man auch sonntag morgens zählen kann, dann bist du das ja wohl.. 😉

da die Schnittstelle public ist, ist sie nicht nur innerhalb der Klasse bekannt, sondern kann überall dort benutzt per SomeClass.ISomeFactory werden, wo auch die Klasse selbst bekannt ist.

cool, ist logisch, auch wenn ich das so noch nicht praktiziert (gesehen) habe.

Diese Art Deklaration kann z.B. dann Sinn machen, wenn SomeClass eine Collection und ISomeFactory der Typ der Elemente der Collection ist.

hm, okay, aber was drückt man damit aus?
die schnittstelle der elemente könnte man ja dennoch separat deklarieren.
wenn durch "public" ohnehin keine "Zugehörigkeit" ausgedrückt wird, sehe ich den sinn dann doch nicht so ganz, denn "überall dort, wo auch die klasse bekannt ist" kann man genausogut durch namensräume oder assemblyzugehörigkeit regeln, oder?

gruß
ron

13.05.2007 - 10:05 Uhr

hallo zusammen,

grabe mich gerade durch eine code suite von sourceforge und bin dabei auf folgendes konstrukt gestoßen (Bsp.):


public sealed class SomeClass 
{
   ...

   public interface ISomeFactory
   {
      ...
   }

   ...
}

Warum würde man eine Schnittstelle in eine Klasse hineindeklarieren?
Heisst das, der Schnittstellentyp darf nur innerhalb der Klasse bekannt sein?
Ist sowas sinnvoll?

thanx für Eure Meinung,
Gruß
ron

11.05.2007 - 18:43 Uhr

hi henning,

Wo merkt sich der/das DataGridView die Anzahl den DataSource-Zuweisungen, bzw. wie kann ich das umgehen?

Das DatagridView merkt sich gar nichts - du musst nichts umgehen.

Welchen Formulartyp Du öffnest, hängt von der BindingSource (also: Name der Tabelle) ab.

Ob der Doppelklick in die Row dann jedesmal eine neue Instanz des passenden Forms öffnet, kannst du ja durch den Gültigkeitsbereich der Variable steuern bzw. indem du die BindingSource der Tabelle an das Formular weiterreichst - das Property myBindingSource.Current ist automatisch das, was deine Form-Controls mit Daten "füttert"

hth
ron

11.05.2007 - 18:01 Uhr

hi dragon,
hi alle runde ecken (und skin-) fans,

ich habe aus aktuellem anlass ein bisschen mit dragons code herumgebastelt und folgende änderungen/erweiterungen vorgenommen:*Die Methode heisst ein bissi anders 😉

*Sie erhält das Control Objekt, dessen Region zu ändern ist, komplett, statt nur seine Dimension *Die Radien von oberen und unteren Ecken können separat angegeben werden

Folgendes ist mir aufgefallen:
Wenn diese Methode auf ein Control (UserControl, Form, etc.) angewendet werden soll, ist es dringend erforderlich, das nach dem Zeichnen zu tun.

Ist das Control bspw. mit Dock.Top in einem Panel, dann darf die Methode erst nach dem myPanel.Controls.Add(rundeEckenDings) abgearbeitet werden.

Da mein UserControl selbst die Sache mit dem Skin in die Hand nehmen soll, habe ich einfach die Anwendung des Skins in das Paint-Ereignis gepackt

protected override void OnPaint(PaintEventArgs e)
{
   base.OnPaint(e);
   if (_SkinType != eSkinType.None)
   {
      Skin skin = new Skin(this, _SkinType);
   }
}


...und der Konstruktor des Skins übernimmt die Arbeit schon bei der Initialisierung mit dem Control, auf dem es zur Anwendung kommen soll:


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

namespace CCL.Common
{
   [Flags]
   public enum eSkinType
   {
      None           = 0, 
      RoundedEdges   = 1, 
      Shadowed       = 2
   }

   public class Skin
   {
   #region .ctor
     public Skin(Control control, eSkinType skin)
     {
        if ((skin & eSkinType.RoundedEdges) == eSkinType.RoundedEdges)
           control.Region = RoundRegionOf(control, 9, 5);
     }
   #endregion

   #region Methods
      public Region RoundRegionOf(Control control, int upperRadius, int lowerRadius)
      {
      // If corner radius is less than or equal to zero, return the original rectangle
         if ((lowerRadius <= 0) || (upperRadius <= 0)) 
            return new Region(control.ClientRectangle); 

      // If corner radius is greater than or equal to half the width or height (whichever is shorter) then return a capsule instead of a lozenge
         double limitVal = (Math.Min(control.ClientRectangle.Width, control.ClientRectangle.Height) / 2.0);
         if ((lowerRadius >= limitVal) || (upperRadius >= limitVal))
            return GetCapsule(control.ClientRectangle);

         GraphicsPath gp = new GraphicsPath();
         Rectangle rect = new Rectangle(control.ClientRectangle.Location, new Size((2 * upperRadius), (2 * upperRadius)));

      // top left arc
         gp.AddArc(rect, 180, 90);

      // top right arc
         rect.X = control.ClientRectangle.Right - (2 * upperRadius);
         gp.AddArc(rect, 270, 90);

      // bottom right arc
         rect = new Rectangle(rect.X + (2 * (upperRadius - lowerRadius)), rect.Y, (2 * lowerRadius), (2 * lowerRadius));
         rect.Y = control.ClientRectangle.Bottom - (2 * lowerRadius);
         gp.AddArc(rect, 0, 90);

      // bottom left arc
         rect.X = control.ClientRectangle.Left;
         gp.AddArc(rect, 90, 90);

         gp.CloseFigure();

         return new Region(gp);
     }
   #endregion
   }
}


gruß
ron

08.05.2007 - 08:39 Uhr

hi friedel,

ein Form kann als Control in ein anderes Form eingefügt werden (TopLevel = false).

Genau deshalb brauche ich diese Funktion: die Form, um die es geht, soll nur als Subform dienen.

Der nächste bitte... 😉

08.05.2007 - 07:51 Uhr

hi zusammen,

ich habe eine klasse von Form geerbt, die in der toolbox angezeigt werden soll.

offensichtlich werden von Form geerbte Klassen aber nicht ohne weiteres vom VS2005 akzeptiert; es wird in der Liste meiner Controls aus der Assembly nicht angeboten.

weiss jemand, wie das geht?

thanx
ron

06.05.2007 - 14:33 Uhr

hallo webstarg

zu kani ist zu ergänzen, dass Items (oder allgemeiner: Eigenschaften gelegentlich) nicht überschreibbar sind.

Dann gilt:


[Browsable(true)]
[EditorBrowsable(EditorBrowsableState.Never)]
public new ObjectCollection Items
{
   get { return base.Items; }
}

gruß
ron

04.05.2007 - 13:22 Uhr

hi capcom,

Wo kann ich diesen Icon festlegen?

du stellst der klassendeklaration den verweis auf die bitmap voran, hier ein beispiel:

   
[System.Drawing.ToolboxBitmap(typeof(myListBox), "Resources.myListBox.bmp")]
public class myListBox : ListBox
...

natürlich musst du dem projekt diese bitmap auch hinzufügen.
sie liegen bei uns im (angegebenen verzeichnis "Resources" mit Buildvorgang "Eingebettete Ressource" und "Nicht kopieren".

hth,
ron

03.05.2007 - 07:41 Uhr

hi shedomann,

jeder tableadapter (oder SqlDataAdapter) hat die commandobjekte SelectCommand, UpdateCommand, InsertCommand, DeleteCommand.

wenn dein (offensichtlich typisiertes) dataset nur select- bzw. insert commands kann, beim update aber einen fehler wirft, ist dein updatecommand objekt entweder nicht definiert oder reflektiert nicht mehr die aktuelle tabellenstruktur.

guck mal in der cs-datei deines datset designers nach.

gruß
ron

ps: und arbeite dich lieber ins thema ein bisschen tiefer ein und verwende dann untypisierte datasets 😉

30.04.2007 - 11:23 Uhr

hi rumtscho,

aus diesem grunde verwendet man am besten den datentyp Guid ( = uniqueIdentifier im SQL Server) als Primärschlüssel.

es erlaubt der anwendung, die guid selbst zu erzeugen mit:


DataRow row = myDataTyble.Rows.Add();
row["RecordID"] = Guid.NewGuid();

und schon dann als verweis im dataset zu benutzen, noch bevor der datensatz physikalisch in der DB vorhanden ist.

deine lösung hat ja außerdem den Performance-Nachteil, dass du ja eigentlich "nur schonmal speicherst", um die ID überhaupt erst zu bekommen, die du dann zur Weiterverarbeitung brauchst.

hth,
ron

30.04.2007 - 10:06 Uhr

hi pixel,

um das streamen muss man sich eigentlich nicht explizit kümmern: datengitter können bei einstellung autogeneratecolumns die typen eigenständig erkennen.

gruß
ron

29.04.2007 - 18:57 Uhr

Hi,

hatte jemand von euch schon mal den effekt, dass in einer Image Spalte eines DataGridView statt dem Bild der Text "Byte[]-Array" zu sehen war?

Leider kann ich nicht genauer festmachen, wann das Phänomen auftritt - das DataSet ist untypisiert, die DataTable enthält korrekte Datentypen.

thanx vorab

ron

29.04.2007 - 16:38 Uhr

hm, hm, hm,

danke für eure idee.

sie ist für meine zwecke ein bisschen unelegant, weil die besitzer des kontextmenüs in unterschiedlichen dll´s liegen, die erst zur laufzeit geladen werden.

ich möchte eigentlich vermeiden, dass irgendein knoten meines treeviews auf verdacht mal ein menuitem einses bestimmten namens sucht, das von einem datengitter einer anderen dll eventuell hinzugefügt worden sein könnte...

ich habe hier http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=1172657&SiteID=1 noch einen interessanten ansatz gefunden: hier wird in den tag der kopie das original item hineingelegt und dann ein PerformClick() aufgerufen.

noch immer nicht der eleganteste (weil bspw. ToolStripSeperators keine ToolStripMenuItems sind und daher noch eine switch anweisung in die verarbeitung müsste), aber es ist eine möglichkeit.

falls es aber **noch etwas eleganteres **gibt, bitte sagt mir bescheid! 😉

gruß
ron

29.04.2007 - 16:18 Uhr

hallo,

zwei steuerelemente sollen ein beinahe identisches kontextmenü haben.
in einem von beiden kommt aber noch ein befehl hinzu.

eine zuweisung und spätere ergänzung um den weiteren befehl scheidet aus, da der befehl dann auch beim ersten control angezeigt wird:


myOtherControl.ContextMenuStrip = myControl.ContextMenuStrip;
myOtherControl.ContextMenuStrip.Items.Add(new ToolStripMenuItem("kannweg"));

folgendes geht auch nicht, weil toolstripmenuItems nur einem toolstrip angehören können und dazu führt, dass das kontextmenü des ersten controls anschliessend leer ist:


ContextMenuStrip cms = new ContextMenuStrip();
cms.Items.AddRange(myControl.ContextMenuStrip.Items);
myOtherControl.ContextMenuStrip = cms;

also wie zum kuckuck "klont" man alle items des einen menüs inklusive bereits zugewiesenem eventhandler, ohne dass dem "original" dabei ein unglück geschieht?

danke für eure hilfe

ron

29.04.2007 - 13:41 Uhr

hallo zusammen,

ich möchte, dass jede Zeile eines DataGridView ein eigenes Kontextmenü hat. Dabei zeigen die meisten Einträge ins Menü aber grundsätzlich auf den gleichen EventHandler.

Das Tag des Kontextmenüs speichert dabei momentan die DatGridViewRow, zu der sie gehört, damit ich beim Verarbeiten im EventHandler herausfinden kann, welche Zeile betroffen ist.

Derzeit verwende ich zur Zuweisung das RowPrePaint-Ereignis, um das Kontextmenü zuzuweisen.


protected virtual void DataGrid_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)
{
// Allow row to get highlighted
   ToolStripMenuItem miHighlight;

// If row contains the row guid field...
   Guid guid = Guid.Empty;
   try
      { guid = (Guid)Rows[e.RowIndex].Cells[RowGuidColumnName].Value; }
   catch { }

// check if row is in highlight list
   if (guid != Guid.Empty) 
   {
      ContextMenuStrip cms = new ContextMenuStrip();
      if (_HighlightedRows.Contains(guid))
      {
         miHighlight = new ToolStripMenuItem("Markierung entfernen", null, tsiHighlight_Click);
      }
      else
         miHighlight = new ToolStripMenuItem("Eintrag markieren", null, tsiHighlight_Click);
      
      miHighlight.Tag = Rows[e.RowIndex];
      miHighlight.Name = "miHighlight";
      cms.Items.AddRange(new ToolStripMenuItem[] { miHighlight });
      Rows[e.RowIndex].ContextMenuStrip = cms;
   }
}

Frage 1:
Sollte der gesamte Code in eine Prüfung gewickelt werden, die zuerst prüft, ob das Kontextmenü nicht sowieso schon zugewiesen ist?
Das RowPrePaint-Ereignis greift ja nur für die zu zeichnenden Zeilen (=aktuell sichtbaren Zeilen) und wird doch also schlimmstenfalls für die gleichen Zeilen mehrmals aufgerufen, oder?

Frage 2:
Wie man sieht, geht es primär im obigen Beispiel darum, dass eine Zeilenmarkierung besteht und der Text sich danach richten muss.
Wäre es ein besserer Ansatz, auf das Ereignis RowContextMenuStripNeeded zu reagieren und das Menü dort erst zuzuweisen?
In diesem Fall "hätte" also die Zeile nicht ihr eigenes Kontextmenü, sondern bei Rechtsklick würde das einzige bestehende Kontextmenü mit ggf. angepasstem Text einfach angezeigt.

Danke für eure Meinung.

ron

27.04.2007 - 08:00 Uhr

hi alfa

myDataGridView.ClearSelection();

hth
ron

25.04.2007 - 17:57 Uhr

hi uwe,

. Wie kann ich die MouseWheel- und die KeyState-Abfrage verbinden?

ich würde die ereignisse keydown / keyup verwenden, um mir die gedrückten tasten unabhängig vom mausrad zu merken.

25.04.2007 - 17:52 Uhr

hi daniel,

Jedoch kann ich nicht einfach bei einem AppFocusChanged das Element geöffnet behalten.

Doch.
Du kannst dann in dem einzelnen ItemClick Ereignis das ContextMenu per Codeanweisung schliessen.

Der Default wäre dann also, dass dein Kontextmenü bei AppFocusChanged immer aufbleibt und nur ausgewählte Klickereignisse das Schliessen selbst übernehmen.

gruß
ron

25.04.2007 - 17:46 Uhr

hi cluening,

eingebaut nicht, aber du kannst an der stelle ja eine (transparente) textbox zeigen.

ron

25.04.2007 - 17:42 Uhr

hi oli

die der datagridview zugrundeliegende bindingsource ist auch sortierbar:


((BindingSource)myDataGridView.DataSource).Sort = "Spalte1;Spalte2;";

hth
ron

25.04.2007 - 17:39 Uhr

hi regen

Eine neue Datetime kann man nicht wieder zusammenbauen?!

doch, mit

DateTime d = new DateTime(jahr, monat, tag, std, min, 0)

übrigens hatte ich in meiner gruppierung die stunde vergessen, also:


select 
   datepart(year, Beginn) as Jahr, 
   datepart(month, Beginn) as Monat,
   datepart(day, Beginn) as Tag,
   datepart(hour, Beginn) as Std,
   datepart(minute, Beginn) as [Min],
   avg([die wertespalte])

from 
   meineTabelle

where 
   (irgendwelche sonstige kriterien)

group by 
   datepart(year, Beginn), 
   datepart(month, Beginn),
   datepart(day, Beginn),
   datepart(hour, Beginn)
   datepart(minute, Beginn)

und dann oben genannte umwandlung.

gruß
ron

24.04.2007 - 23:19 Uhr

hi thomae,

warum muss der footer in das scrolling mit eingebunden werden?

ich würde ein panel unter das datagridview kleben, den footer reinpacken und das ganze optisch angleichen.

gruß
ron

24.04.2007 - 23:17 Uhr

hi regen,

das hier könnte sein, was du brauchst:


select 
   datepart(year, Beginn), 
   datepart(month, Beginn),
   datepart(day, Beginn),
   datepart(minute, Beginn),
   avg([die wertespalte])

from 
   meineTabelle

where 
   (irgendwelche sonstige kriterien)

group by 
   datepart(year, Beginn), 
   datepart(month, Beginn),
   datepart(day, Beginn),
   datepart(minute, Beginn)

zwei nachteile:

  • nicht genannte minuten kommen auch nicht vor
  • du musst die gruppierten einzelteile zur anzeige wieder zusammenfügen

hth
ron

24.04.2007 - 22:55 Uhr

hi bär,

ich könnte mir vorstellen, dass das datenbankabhängig ist - vom sql server bekommst du die id nicht vorher.

aus diesem grunde verwenden viele (u.a. auch wir) den datentyp Guid ( = uniqueIdentifier im SQL Server) als Primärschlüssel.

es erlaubt der anwendung, die guid selbst zu erzeugen mit:


DataRow row = myDataTyble.Rows.Add();
row["RecordID"] = Guid.NewGuid();

hth,
ron

23.04.2007 - 18:17 Uhr

hi hoffmann,

da SelectedRows keine Schreibeigenschaft ist bzw. nicht wie andere Kollektionen die Methode Add() anbietet, kannst du "analog dazu" nur für einzelne Zeilen beim Laden die Eigenschaft Selected bestimmter Zeilen festlegen:

dataGrid.Rows[6].Selected = true;

die betreffende zeile wird dann automatisch "mitglied" der SelectedRows-Kollektion.

hth
ron

23.04.2007 - 08:00 Uhr

Moin herbivore,

mein ansatz ist halt zum einen, wenn mich mein kunde anruft und sagt: "Dies oder jenes funktioniert nicht", ist die Antwort "Seltsam, bei mir funktioniert es" für ihn nicht der Hinweis darauf, an dieser Stelle nicht "weiter zu forschen"...

Zum anderen ist es so, dass ich zum Beispiel in diesem Forum in den Bereichen, in denen ich mich fit glaube, aus Zeitgründen nur durch die Liste der **offenen **Fragen gehe (also: Antworten = 0), um zu sehen, ob ich da helfen kann.
Sehe ich aber, dass da schon jemand geantwortet hat, und dann auch noch ein Name da steht, der üblicherweise für hochqualifizierte Antworten steht (und da gibt es eben so ein paar Namen im Forum, zu denen eben imho auch Noodles gehört...), dann mache ich mir natürlich nicht mehr die Mühe, mich auch noch "einzumischen"...
Ich glaube, ich bin nicht der einzige, der so vorgeht.

Daher finde ich halt, dass mit "Seltsam, bei mir funktioniert es" dem Fragenden nicht nur wahrscheinlich nicht weitergeholfen wurde, sondern im schlimmsten Fall er so auch um weitere qualifizierte Antworten gebracht wird.

Wie gesagt, ist erstens ja nicht persönlich gemeint und zweitens nur meine bescheidene Meinung 😉

Gruß
Ron

22.04.2007 - 14:15 Uhr

hi bartolo

primärschlüssel sollten nicht über mehrere informationen "breitgetreten" werden.

es ist vielleicht noch legitim, redundant spalten zu sprechenden merkmalen zusammenzusetzen, sie aber zur erkennung zu verwenden ist, wie du ja jetzt selber siehst, bedenklich.

wenn du selbst der datenarchitekt bist, dann nimm eine zählerspalte.

Wie löst man das Problem, das eine Zahl nur einmal vergeben werden darf, auch wenn diese gelöscht wird?

ermittele einfach das maximum der spalte und addiere 1.
sql beispiel:


declare 
   @neuerWert int

SELECT @neuerWert = Max(meineSpalte) +1 FROM [meineTabelle]

hth,
ron

22.04.2007 - 14:09 Uhr

hey noodles,

langsam verstehe ich, wie man auf über 4000 einträge kommt...

ist nicht persönlich gemeint 😉

bussy
ron

22.04.2007 - 09:51 Uhr

Auch Moin.

Grundidee war, dass wir in fortgeschrittenen Programmiertechniken (das hiess fuer mich: Pattern, Design, Tipps rund um trickreichere Dinge wie Multithreading etc.) geschult werden.

Als ich in das Thema C# und .Net eingestiegen bin, habe ich ein einwöchiges sogenanntes "Camp" bei einer nicht näher genannten Firma besucht. Abgesehen von der inhaltlich eher oberflächlichen bis minderen Gesamtqualität ist mir davon nachhaltig folgende Situation im Gedächtnis geblieben:

Einer der (15) Schulungsteilnehmer fragte einen der über die Woche eingesetzten wechselnden drei Trainer, ob wir denn hier auch "best practices" (also: Tipps rund um trickreichere Dinge) vermittelt bekommen würden.

Die Antwort des Trainers war:
"Nun, das werden Sie hier natürlich nicht lernen, denn damit verdienen wir uns in den Projekten unser tägliches Brot".
Es gibt also tatsächlich die Einstellung von sogenannten "Seminarleitern", die wirklich aus der Praxis verwendbaren Kenntnisse aus Konkurrenzangst gar nicht vermitteln zu wollen.

Nachfrage
Ich bin selbst Trainer und Ausbilder von Fachinformatikern in freiberuflicher Kooperation.
In dem betreffenden Unternehmen haben wir selbst vor oben genanntem Hintergrund mehrfach versucht, einwöchige hochwertige C# Architect Camps zu einem echt guten Preis angeboten, die auch entsprechend beworben wurden, also: Einsatz von Entwurfsmustern, MVP, CFD und Microkernelarchitektur, uvm.

Die Nachfrage nach solch "Eingemachtem" als offenes Seminar scheint aber leider nicht dazusein; jedenfalls haben wir das Camp bis heute mangels Nachfrage nicht ein einziges Mal durchgeführt.

Mein Tip
Da mir die Vorträge von Ralf Westphal auf der Prio gut gefallen haben, habe ich kurzerhand im Dezember für einen unserer Auszubildenden Anwendungsentwickler und mich selbst einen eintägigen Workshop bei ihm gebucht.
Von diesem intensiven Arbeitstag zu dritt profitieren wir noch heute.
Ich kann also jedem Lernwilligen (und auch Arbeitgeber ebensolcher) empfehlen, sich eine Kapazität des gewünschten Fachs einfach ganz dediziert für einen festgelegten Zeitraum mit vorher abgestimmten Inhalten zu buchen - das bringt im Zweifelsfall (für übrigens ++nicht ++wesentlich mehr Geld) mehr Fachwissen ans Ziel.

Gruß
ron

22.04.2007 - 09:06 Uhr

hi housefreak,

ich würde mal tippen, der zeitpunkt der kontextmenüvervollständigung liegt nach der erstellung des datagrids, bzw. dessen füllung (RowsAdded-Ereignis), denn die row templates werden schon beim anlegen der zeilen verwendet.

hth
ron

21.04.2007 - 10:25 Uhr

holy sh... !!!

peinlich, peinlich 8o

thanx
ron

21.04.2007 - 10:05 Uhr

hallo leute,

wie adressiert man per code das links oben gelegene feld über den zeilenköpfen (also links von den spaltenköpfen) per code.

es geht nicht (obwohl ich das irgendwo mal gesehen habe):


  myGrid.Columns[-1].Cells[0]...
// oder
  myGrid.Rows[-1].Cells[0]...

und wie ist eigentlich die deutsche bezeichnung für diesen zeilenspaltenkopf?

ich würde gerne dort einige "sachen" plazieren...

danke für eure hilfe.
gruß
ron