Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Portal
  • |
  • Mitglieder
Beiträge von Kileak
Thema: Methode einer Basisklasse versiegeln
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Vielleicht versteh ich dich ja einfach nur falsch, aber:

private ?

Thema: [gelöst] Werte in Registry verschwunden bzw. versteckt, wenn Programm als x86/32Bit übersetzt
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

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...

pinvoke.net: regopenkeyex (advapi32)

Da steht alles was Du brauchst (weiter unten ist sogar direkt ein Beispiel für deinen Frage)

Thema: Winforms MVP und Commandpattern: Arbeitet das Command auf den Modell oder dem Presenter?
Am im Forum: Rund um die Programmierung

Schon, der Presenter sollte den Aufruf einfach ans Model durchreichen.

Thema: Winforms MVP und Commandpattern: Arbeitet das Command auf den Modell oder dem Presenter?
Am im Forum: Rund um die Programmierung

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).

Thema: Im Leave Control Event herausfinden welches Control fokussiert wird
Am im Forum: GUI: Windows-Forms

Mit einer rekursiven Methode.

Thema: VS Express: Debugger zeigt auftretende/unbehandele Exception nicht an
Am im Forum: Entwicklungs- und Laufzeitumgebung (Infrastruktur)

Hast Du überhaupt "Break, when an exception is Thrown" aktiviert?

-> Debug -> Exceptions

Bei "Common Language Runtime Exceptions" einen Haken bei "Thrown" setzen und nochmal probieren.

Thema: UltraGrid: Select Column, wie?
Am im Forum: GUI: Windows-Forms

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]
  }
}

Thema: ContextmenuStrip ohne AutoClose
Am im Forum: GUI: Windows-Forms

Setz AutoClose auf true, und fang stattdessen das Closing-Event ab

private void contextMenuStrip1_Closing(object sender, ToolStripDropDownClosingEventArgs e)
{
    if (e.CloseReason == ToolStripDropDownCloseReason.ItemClicked)
        e.Cancel = true;
}

Thema: Eingabe String sofort verwenden
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Das kommt mir zu einfach vor

    public delegate T MethodDel<T, T1>(T1 paramArgs);

    public class MethodList<T, T1>
    {
        private static Dictionary<string, MethodDel<T, T1>> Methods { get; set; }

        public MethodList()
        {
            Methods = new Dictionary<string, MethodDel<T, T1>>();
        }

        public void Register(string methodKey, MethodDel<T, T1> method)
        {
            if (!Methods.ContainsKey(methodKey))
                Methods.Add(methodKey, method);
        }

        public MethodDel<T, T1> this[string methodKey]
        {
            get
            {
                if (Methods.ContainsKey(methodKey))
                    return Methods[methodKey];

                return ((T1 b) => { Trace.WriteLine(string.Format("Method not implemented ({0})", methodKey)); return default(T); });
            }
        }
    }

    public static class MethodFactory<T, T1>
    {
        public static MethodList<T, T1> Methods { get; private set; }

        static MethodFactory()
        {
            Methods = new MethodList<T, T1>();
        }

        public static void Register(string methodKey, MethodDel<T, T1> method)
        {
            Methods.Register(methodKey, method);
        }
    }

Da kann man ganz "einfach" seine Methoden registrieren


public int Method1(int param)
{
    Console.WriteLine("Method1");

    return 0;
}

public int Method2(int param)
{
    Console.WriteLine("Method2");

    return 0;
}

...

MethodFactory<int,int>.Register("a", Method1);
MethodFactory<int,int>.Register("b", Method2);
MethodFactory<int,int>.Register("c", testClass.Method3);

und das ganze dann über

string eingabe = Console.ReadLine();
int param = 10;

MethodFactory<int, int>.Methods[eingabe](param);

aufrufen. Über den Sinn und Unsinn lässt sich hierbei natürlich streiten, aber zumindest kommen kaum if's drin vor

Thema: Event Argumente uebergeben
Am im Forum: Rund um die Programmierung

Ich nehme dafür meist eine generische EventArgs-Klasse, mit der man auf die Schnelle beliebige Argumente übergeben kann

public class EventArgs<T> : EventArgs
{
    public T Data { get; set; }

    public EventArgs(T data)
    {
        Data = data;
    }
}

Entsprechender EventHandler dazu sähe dann so aus


public event EventHandler<EventArgs<string>> TestEvent

...
if (TestEvent != null)
{
    TestEvent(this, new EventArgs<string>("Test"));
}

Im Ergeignis an sich, kannst Du dann einfach über Data drauf zugreifen


void Form1_TestEvent(object sender, EventArgs<string> e)
{
    MessageBox.Show(e.Data);
}

Wenn Du mehrere Argumente brauchst, kannst Du sie in eine ensptr. Klasse packen und die genauso übergeben.

Thema: Dynamisch erzeugte Menü-Einträge: Im Eventhandler erkennen, welcher geklickt wurde
Am im Forum: GUI: Windows-Forms

Ü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);
    }
}

Thema: [gelöst] FusionLogVW.exe - wie einschalten?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Ohne FusionLog zu kennen, ist dein Versuch den EnableLog-Schlüssel anzulegen wohl etwas schiefgegangen.

Lösch den Eintrag, danach Rechtsklick auf Fusion->"Neu"->"DWORD-Wert". Nenn den Eintrag EnableLog und setz den Wert auf 1.

Dasselbe mit dem LogResourceBinds-Eintrag.

Thema: Beim Binden einer List<> an eine ListBox wird in allen Einträgen der Typ der Elemente angezeigt
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

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.

Thema: alles bis auf einen Button sperren
Am im Forum: GUI: Windows-Forms

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.

Thema: Der Name xyz ist im aktuellen Kontext nicht vorhanden.
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Solang M233 lokal deklariert bleibt, wird sie beim M233.Kill() auch nie definiert sein...

Thema: Automatisches Feuern eines Events nach Methodenaufruf
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

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...

Thema: Flimmern im ListView verhindern
Am im Forum: GUI: Windows-Forms

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).

Thema: ToolTip erscheint nur kurz
Am im Forum: GUI: Windows-Forms

Benutz immer dasselbe Tooltip-Objekt und erstelle nicht für jeden Hover ein neues

ToolTip testTool = new ToolTip();

private void listView1_ItemMouseHover(object sender, ListViewItemMouseHoverEventArgs e)
{
    testTool.Hide(listView1);
    testTool.Show(e.Item.Text, listView1, 3000);
}

Dann sollte es wie erwartet funktionieren.

Thema: variable Matrix über Array legen
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

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.

Thema: Bild auf sekundären Bildschirm im Vollbild anzeigen.
Am im Forum: GUI: Windows-Forms

Ü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);                
}

Thema: alle *.txt Dateien in ArrayList ? was mach ich falsch?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

GetFiles liefert dir ein Array zurück, das Du als einzelnes Objekt deiner Fileliste hinzufügst, daher ist deren Grösse 1.

Wenn Du dir dieses eine Element ansiehst, wirst Du merken das es wiederum ein Array mit den gesuchten Dateinamen ist (string[]).

Du könntest es also entweder als


string[] fileList = Directory.GetFiles(@"C:\", "*.txt");

lösen. Dann hast Du direkt das richtige Array mit den Dateinamen, oder wenn Du es unbedingt als ArrayList möchtest als


FileListe.AddRange (Directory.GetFiles(@"C:\", "*.txt"));

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.

Thema: [gelöst] DatagridView: Position des ContextMenuStrip immer korrekt berechnen
Am im Forum: GUI: Windows-Forms

Was spricht dagegen das Menü einfach bei

Control.MousePosition

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)?

Thema: DataGridView Spaltennamen identifizieren
Am im Forum: GUI: Windows-Forms

RowIndex ist, wie der Name vermuten lässt, der Index der Zeile, nicht der Spalte ;)

An die Spaltenüberschrift kommst Du z.B. mit

dataGridView.Columns[e.ColumnIndex].HeaderText

Thema: "+" vor TreeNode entfernen.
Am im Forum: GUI: Windows-Forms

Zitat von Aschratt
ähnlich also wie beim Visual Studio Projektmappenexplorer der oberste Node, der die Solution angibt.

Genau dieses Verhalten erhält man mit 'ShowRootLines=false'

Thema: "+" vor TreeNode entfernen.
Am im Forum: GUI: Windows-Forms

treeView.ShowRootLines = false;

Damit hat dein Hauptnode kein + aber die Unterknoten noch. Sollen diese auch kein '+' mehr davor haben

treeView.ShowPlusMinus = false;

Thema: Finden eines Controls
Am im Forum: GUI: Windows-Forms

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.


Label testControl = new Label();
testControl.Text = "Woohoo";
testControl.Name = "testName";

Controls.Add(testControl);

Control[] controls = Controls.Find("testName", true);

if (controls != null && controls.Length > 0)
{
    controls[0].Text = "Test yay";
}
else
{
    MessageBox.Show("Control not found");
}

Thema: Was für eine Collection für Zuordnung von Telefonnummer zu Name?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

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).

Thema: Math.Round rundet anders als erwartet
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

MSDN: Math.Round(double)

Zitat
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.

Thema: ListBox: Item + Value setzen
Am im Forum: GUI: Windows-Forms

Zitat von Doltsche
Danke für die Antwort.

Das hier funktioniert leider nicht so wirklich.


bindingSource.DataSource = listWarenkorb;
lbWarenkorb.DataSource = bindingSource;  

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;
        }
    }

Thema: ListBox: Item + Value setzen
Am im Forum: GUI: Windows-Forms

Nicht ausprobiert, aber mit einer BindingSource dazwischen sollte das funktionieren.


bindingSource.DataSource = listWarenkorb;
lbWarenkorb.DataSource = bindingSource;

Bei einer Änderung der Liste solltest Du mit


bindingSource.ResetBindings(false);

eine Aktualisierung bekommen.