Von einer 32Bit-Anwendung auf den 64Bit-Teil zuzugreifen ist in meinen Augen zwar nicht die feine englische Art, aber wenn Du es unbedingt brauchst kannst Du es auch über die WinApi-Version RegOpenKeyEx machen...
Die Methode AddOrder kommt ins Model und der Presenter, wie auch der Command rufen die Methode des Models auf (Der Presenter kann auf das Hinzufügen eines Orders im Model ggf. durch ein entsprechendes Event reagieren).
Da du Selected.Columns ja schon hast, geh ich mal davon aus das du das Selektieren der Spalte ja doch schon hast, und jetzt nur noch an die zugehörigen Zellen-Inhalte kommen willst.
Bin mir grad nicht sicher, ob es nicht eine einfachere Möglichkeit gibt, direkt an die ausgewählten Zellen zu kommen, aber zur Not kommst Du auch nur über den ColumnHeader an die Inhalte, in dem Du über die Rows iterierst und direkt auf die Zelle zugreifst.
(Ungetestet, da grad kein Infragistics zur Hand)
foreach (ColumnHeader colHeader in gridX.Selected.Columns) {
foreach(UltraGridRow row in gridX.Rows) {
value = row[colHeader.Column]
}
}
Über den sender des Events kommst du an das entspr. ToolStripItem das den Dateinamen enthält (bei deinem Beispielt kämst Du so z.B. über das Text-Property an den Dateinamen)
ToolStripItem item = fileToolStripMenuItem.DropDownItems.Add("Dateiname");
item.Click += new EventHandler(item_Click);
}
void item_Click(object sender, EventArgs e)
{
ToolStripItem srcItem = sender as ToolStripItem;
if (srcItem != null)
{
MessageBox.Show(srcItem.Text);
}
}
Kurz: Überschreibe die ToString-Methode in der mitarbeiter-Klasse...
Fürs Verschieben zwischen den Trees kannst Du mit DoDragDrop eine Drag&Drop-Operation anfangen und über die DragOver-, DragDrop-Events der Trees feststellen, wenn Items reingezogen wurden.
Meinst Du mit 'schön aussehen' die Oberfläche oder den Code dazu?
Um alle Controls einfach zu deaktivieren/aktivieren einfach ein Panel auf die Form und die entspr. Controls reingezogen, und im Code lediglich das Panel enablen/disablen.
Wenns dir um das Aussehen der Oberfläche geht: Der Benutzer ist sicher froh darüber, am 'Disabled'-Aussehen der Buttons, Textboxen, etc. direkt zu wissen, dass er diese nicht ändern kann.
Eine andere Möglichkeit wäre auch eine Wrapper-Methode in der Basisklasse, die statt deiner abstrakten Methode aufgerufen wird. Diese ruft entspr. die implementierte Methode auf und feuert danach das Event.
So muss dein 'Implementierer' nichts von dem Event wissen und nur die entspr. abstrakte Methode überschreiben.
Grad so hingekritzelt sähe das so aus
public class BaseClassXYZ {
protected abstract xyzMethode();
public void Methode() {
xyzMethode();
FireEvent();
}
}
Entspr. müsste dann nur die xyzMethode überschrieben werden...
Da Du die writeLog-Methode für jedes Item extra aufrufst, hat dein Begin/EndUpdate so ziemlich gar keinen Effekt, da Du letztenendes ja doch immer nur ein Item hinzufügst. Der Effekt ist also derselbe als wenn Du es ganz weglassen würdest.
Eine kleine Verbesserung wäre vielleicht zumindest eine Liste, in der dein Thread die Items hinzufügen kann, und Du aus dieser Liste dann alle x Items deine ListView aktualisierst (bzw. sobald dein Thread fertig ist, alle restlichen Items).
Ohne jetzt deinen ganzen Ansatz komplett nachvollzogen zu haben, scheinen mir da doch einige Ungereimtheiten drin zu sein.
Zum einen benutzt du eine lokale Variable l sowie l als Index für die for-schleife. Abgesehen davon das sich der Code so nicht kompilieren lässt, ist so auch nicht ganz nachzuvollziehen welches l wann genutzt werden soll.
Soll die Matrix über das gesamte 2-dimensionale Array laufen, sind wohl auch zwei verschachtelte for-schleifen angebracht, im Moment durchläufst Du ja nur einmal die Breite deines Arrays (wobei Du dann auch noch in jedem Schritt nur einen Wert deiner Matrix hinzurechnest).
Falls ich dich nicht ganz missverstanden habe, möchtest Du z.B. eine 3x3 Matrix von oben links über alle Spalten/Zeilen wandern lassen und jeweils den Mittelwert der 9 Werte berechnen.
Das könnte dann so in diese Richtung aussehen.
// zweidimensionales Array durchlaufen
for (int y=0; y<hoehe-matrixHoehe; ++y) {
for (int x=0; x<breite-matrixBreite; ++x) {
// Die Matrix an sich durchlaufen
for (int ym=0; ym<matrixHoehe; ++ym) {
for (int xm=0; xm<matrixBreite; ++xm) {
// Wert aus dem Array
zweiDim[x+xm, y+ym]
}
}
}
}
}
So würdest Du zumindest schon mal das gesamte Array durchlaufen und die Werte "über denen deine Matrix momentan liegt" bekommen.
Über Screen kannst Du dir auch die genauen Positionen des zweiten Bildschirms holen (und bist so unabhängig davon ob er "links" oder "rechts" vom primären ist)
So könntest Du z.B. eine Form auf dem sekundären über den gesamten Bildschirm anzeigen lassen
if (Screen.AllScreens != null && Screen.AllScreens.Length > 1)
{
FormBorderStyle = FormBorderStyle.None;
Location = new Point(Screen.AllScreens[1].Bounds.X, Screen.AllScreens[1].Bounds.Y);
Size = new Size(Screen.AllScreens[1].Bounds.Width, Screen.AllScreens[1].Bounds.Height);
}
Dann werden die Elemente einzeln deiner Liste hinzugefügt.
Da Du ja aber eh dann z.B. die Erstellungsdaten ermitteln willst, würde es sich wohl anbieten direkt über FileInfo/DirectoryInfo zu gehen, da Du dann nicht nur die Dateinamen sondern auch direkt alle Dateiinformationen gesammelt zur Verfügung stehen hast.
anzuzeigen, anstatt die Position der Maus extra nochmal zu berechnen (zumindest sieht dein Bild danach aus, dass Du das Menü doch an der Mausposition anzeigen möchtest)?
Dann hast Du wohl deinem Control vorm Hinzufügen zu deinem Fenster keinen korrekten Namen gegeben, über den Du es später in der Control-Collection finden kannst.
Wenn jeder Name "wirklich" nur einmal vorkommen dürfte (was grade bei Namen wie Müller&Co doch sehr fraglich ist), könntest Du dafür einen Hashtable nehmen.
Da würde sich dann auch wie von dir gewünscht mit
HashtableName["Maier"]
drauf zugreifen lassen. Da es ja aber in einem Telefonbuch meist nicht nur einen Eintrag zu einem Nachnamen gibt, könntest Du den Nachnamen auch einfach als Key benuzen, und dort eine Liste mit Personen einfügen, die den Namen "Maier" enthalten. So könntest Du über den Nachnamen auf alle Personen zugreifen, die denselben Nachnamen haben (besser wäre aber wohl doch ein eindeutiger Key für den Hashtable zu nehmen).
Rückgabewert
Der der Ganzzahl am nächsten liegende a. Wenn a genau in der Mitte zwischen zwei Ganzzahlen liegt, von denen eine gerade und die andere ungerade ist, wird die gerade Zahl zurückgegeben.
Hinweise
Das Verhalten dieser Methode entspricht dem Standard IEEE 754, Abschnitt 4. Diese Art der Rundung wird zuweilen als Rundung auf den nächsten Wert bzw. unverzerrte Rundung (Banker's Rounding) bezeichnet.
Na, da hab ichs ja doch mal ausprobiert und es macht eigtl genau das was du brauchst.
Hier noch mal ein kleines Beispiel. Die BindingSource ist btw. mit dem Designer einfach draufgezogen (System.Windows.Forms.BindingSource), vllt hast Du da die falsche genommen.
Von der Funktionalität kommts dem zuweisen von null und darauf der alten Liste zwar gleich, aber für das Binden von Daten an Controls finde ich BindingSources passender (und sie bieten im nachhinein auch noch etwas zusätzliche Funktionalität)
public partial class Form1 : Form
{
List<TestEntry> testList;
public Form1()
{
InitializeComponent();
testList = new List<TestEntry>();
bindingSource.DataSource = testList;
listBox1.DataSource = bindingSource;
}
private void button1_Click(object sender, EventArgs e)
{
testList.Add(new TestEntry("newentry", 0));
bindingSource.ResetBindings(false);
}
}
public class TestEntry
{
string text;
long value;
public TestEntry(string txt, long val)
{
text = txt;
value = val;
}
public override string ToString()
{
return text;
}
}