ich habe eine BindingList an ein DataGridView gebunden. Das Füllen und Ändern an sich funktioniert soweit auch sehr gut. Am Anfang wird meine Liste mit 72 Einträgen gefüllt. Dabei fängt das Grid bzw. die ganze Maske furchtbar an zu flackern und die CPU-Auslastung geht sage und schreibe auf 50 % hoch. Das Grid hat nur drei Spalten die minimal befüllt werden. Wenn das Grid vollständig gefüllt ist flackert es immer noch 8o
Das Autosizing scheint auch keine Auswirkungen zu haben (es kommt mit und ohne Autosize das komische Flackern).
Aus Visual Basic 6 bin ich es gewöhnt bei den verschiedenen Fällen (Cases) die ich mit Select Case abfrage, auch Wertebereiche abfragen zu können.
Das sieht in VB z. B. so aus:
Select Case mFileSize
Case 0 To 999 ' Bytes
FormatFileSize = Format(mFileSize) & " bytes"
Case 1000 To 1023999 ' KB
FormatFileSize = Format(mFileSize / 1024, "##0.0") & " KB"
Case 1024000 To (1024 * 10 ^ 6) - 1 ' MB
FormatFileSize = Format(mFileSize / (1024 ^ 2), "##0.0#") & " MB"
Case Is > (1024 * 10 ^ 6)
FormatFileSize = Format(mFileSize / (1024 ^ 3), "##0.0#") & " GB"
End Select
Ich habe leider keinerlei Beispiele hierzu in C# gefunden. Geht das in C# auch? Wenn ja, kann mir jemand bitte die Syntax posten? Google und die msdn spucken nichts hierzu aus.
Hat jemand zufällig ein Beispiel einer SortedList mit Custom Compare was auch funktioniert? Ich hab mittlerweile 5 verschiedene Beispiele ausprobiert, die alle miteinander nicht funktionieren bzw. sich nicht mal starten lassen.
Ich möchte doch nur nach einem Attribut eines Objekts sortieren. Das muss doch mit Hausmitteln von .NET einfach machbar sein
Wie genau übergebe ich den Comparer an das Dictionary?
Was mache ich hier falsch? Der Compiler findet keine passende Überladung und ich verstehe gerade nicht so richtig, wie ich den Comparer übergeben muss X(
SortedDictionary<string, Spieler> colSpielerTeam1 = new SortedDictionary<string, Spieler>(new SpielerComparer());
class SpielerComparer : IComparer<Spieler>
{
#region IComparer<Spieler> Member
public int Compare(Spieler x, Spieler y)
{
if (x.Rang > y.Rang)
{
return 1;
}
else
{
return -1;
}
}
#endregion
}
ich komme per Google und Forumssuche irgendwie nicht weiter und denke dass Ihr mir bestimmt helfen könnt ;)
Ich habe ein Hashtable dem einige Objekte hinzugefügt werden. Ganz zum Schluss möchte ich den Hashtable anhand eines Attributs der Objekte sortieren. Wie stelle ich das an?
da ich im Forum keine passende Lösung gefunden habe und partou nicht dahinter komme was an meinem Pattern nicht funktioniert frage ich Euch:
String pattern = @"<a href=""(?<url>[^""]+)"">(?<text>[^<]+)</a>";
Regex r = new Regex(pattern);
MatchCollection mc = r.Matches(s);
Mit diesem Code möchte ich gerne alle Links aus einem HTML-Quelltext ermitteln. URL und Text möchte ich dabei komfortabel über Groups abfragen können:
foreach (Match m in mc)
Console.WriteLine("{1} : {0}", m.Groups["url"], m.Groups["text"]);
Leider bekomme ich kein Ergebnis wieder, was bestimmt an meinem Pattern liegt.
Hat einer von Euch Regex-Experten eine Idee, was ich falsch gemacht habe? 8)
Ich schreibe gerade ein Anitcheattool für ein Spiel. Dieses Tool liest in regelmäßigen Abständen Daten aus dem Speicherbereich des Spiels aus und protokolliert diese. Das ganze wird für einen offiziellen Wettbewerb (Europameisterschaft) des Spiels benötigt.
Damit kann die Jury später sicherstellen, dass jeder sich während der Missionen im Spiel an die vorgegebenen Parameter gehalten hat.
Hat ein Spieler eine Mission beendet, erscheint im Spiel ein spezieller Bildschirm. Diesen Bildschirm bzw. dieses Fenster muss ich irgendwie abfragen um gewisse Aktionen in meinem Programm auslösen zu können. Leider ist das Fenster anscheinend kein neues Fenster innerhalb der Anwendung, sondern wird einfach im Hauptfenster des Spiels dargestellt (ich weiss leider nicht genau wie das bei DirectX-Anwendungen funktioniert).
Jedenfalls habe ich mit diversen Prozessviewern versucht herauszufinden ob es sich hierbei um ein eigenes Fenster handelt oder nicht. Anscheinend nicht. Auch die EnumWindow-Klasse aus dem Thread Windowstitel auslesen gibt mir keine Childwindows wieder, wenn ich diese über das Handle der Hauptanwendung abfragen möchte.
Funktioniert die Fenstertechnik bei DirectX-Anwendungen anders? Oder ist es, wie vermutet kein neues Fenster was nach dem Beenden der Mission angezeigt wird. Gibt es die Möglichkeit Steuerelemente aus DirectX-Anwendungen abzufragen?
Wäre echt klasse, wenn mir jemand helfen könnte =)
auf der Suche nach Beispielcode wie ich systemweit Tastatureingaben (mir geht es um eine spezielle Tastenkombination) abfrage, bin ich auf deine Hook-Klasse gestoßen. Diese habe ich in mein Projekt eingebunden und das von mir definierte Event wird auch wunderbar aufgerufen.
Jetzt meine Frage als jemand der noch nicht so erfahren in C# ist: Wie frage ich mit Hilfe Deiner Klasse bestimmte Tastenkombinationen (z. B. SHIFT+ALT-N) ab?
ich benutze die SharpZipLib um mehrere Dateien in meiner Applikation zu packen. Funktioniert soweit auch problemlos.
Wenn ich das Archiv jetzt z. B. mit Winrar entpacken will bekomme ich Fehlermeldungen, dass die im Archiv enthaltenen Dateien korrupt seien. Dasselbe bei 7zip. Nur mit der ZIP-Funktion von Windows-XP lassen sich die Dateien problemlos extrahieren.
Ich möchte aber sicherstellen, dass sich das Archiv mit allen gängigen Programmen extrahieren lässt.
Hier mein Quellcode:
private static void WriteZipFile(List<string> filesToZip, string path, int compression)
{
if (compression < 0 || compression > 9)
throw new ArgumentException("Invalid compression rate.");
if (!Directory.Exists(new FileInfo(path).Directory.ToString()))
throw new ArgumentException("The Path does not exist.");
foreach (string c in filesToZip)
if (!File.Exists(c))
throw new ArgumentException(string.Format("The File{0}does not exist!", c));
Crc32 crc32 = new Crc32();
ZipOutputStream stream = new ZipOutputStream(File.Create(path));
stream.SetLevel(compression);
for (int i = 0; i < filesToZip.Count; i++)
{
ZipEntry entry = new ZipEntry(Path.GetFileName(filesToZip[i]));
entry.DateTime = DateTime.Now;
using (FileStream fs = File.OpenRead(filesToZip[i]))
{
byte[] buffer = new byte[fs.Length];
fs.Read(buffer, 0, buffer.Length);
entry.Size = fs.Length;
fs.Close();
crc32.Reset();
crc32.Update(buffer);
entry.Crc = crc32.Value;
stream.PutNextEntry(entry);
stream.Write(buffer, 0, buffer.Length);
}
}
stream.Finish();
stream.Close();
}
compression wird mit 0 übergeben.
Hat jemand eine Idee woran das liegen könnte. Mache ich beim Packen in meiner Methode was falsch?
danke für Deine Hilfe, durch das letzte Beispiel bin ich letztendlich auf die richtige Lösung gekommen:
private void tvMain_DragOver(object sender, DragEventArgs e)
{
if (e.Data.GetData(typeof(ListViewItem)) != null)
{
TreeNode node = tvMain.GetNodeAt(tvMain.PointToClient(new Point(e.X, e.Y)));
if (node != null)
{
e.Effect = DragDropEffects.Move;
tvMain.SelectedNode = node;
tvMain.Focus(); //wichtig damit das markierte Element auch so angezeigt wird.
}
}
}
Man muss den Focus auf das Treeview setzen, damit das SelectedNode auch wirklich als ausgewählt (blau markiert) angezeigt wird. Denn wenn ein anderes Steuerelement den Focus erhält, bleibt zwar das Objekt SelectedNode erhalten, die blaue Markierung aber nicht...
ich habe in meiner Anwendung die Drag & Drop-Funktionalität von einem ListView in ein TreeView implementiert. D. h. ich kann ListViewItems auf ein TreeNode ziehe und dann wird automatisch unter dem TreeNode ein neuer Node generiert. Soweit so gut.
Um dem Anwender den Drag & Drop-Vorgang zu erleichtern, würde ich gerne den TreeNode über dem sich die Maus beim Drag & Drop-Vorgang gerade befindet markieren.
Das funktioniert leider nicht so einfach wie ich es mir vorgestellt habe, bzw. ich mache irgendwas falsch und finde den Fehler nicht:
private void tvMain_DragOver(object sender, DragEventArgs e)
{
if (e.Data.GetData(typeof(ListViewItem)) != null)
{
Point p = new Point(e.X, e.Y);
tvMain.PointToClient(p);
TreeNode node = tvMain.GetNodeAt(p);
if (node != null)
{
tvMain.SelectedNode = node;
}
}
}
Auch wenn "node" nicht null ist funktioniert das setzen des SelectedNode's nicht: Der Node wird nicht blau markiert.
Das Intellisense von VB6 die Funktionen nicht anzeigt, liegt daran, dass VB6 nicht jede COM-Bibliothek (in dem Fall eine DOT NET Assembly) lesen kann. Da es das Problem in mehreren IDEs gibt, gibt es die Möglichkeit, alle COM-Klassen sowie Interfaces mit dem jeweiligen Funktionen als eine Typbibliothek (Endung .tlb) zu exportieren. Dort enthalten sind dann jeweils die entsprechenden Verweise zu den einzelnen Funktionen der Bibliothek. In deiner IDE bindest du statt die COM-Bibliothek anschließend die TLB ein.
Das man eine DispID in DOT NET angeben muss, ist mir auch neu. Normal weißt die CLR eine entsprechende ID jedem öffentlichen Member zu.
Die TBL-Datei habe ich bereits eingebunden. Als es das erste Mal funktioniert hat, hat VB mir auch alles wunderbar angezeigt. Als ich dann eine weitere Funktion hinzugefügt hab, wurden mir in VB keine Funktionen mehr angezeigt. Komischerweise sehe ich im Objektkatalog in VB meine beiden Funktionen als Events.
Gehe ich beim Erstellen der TBL-Datei denn richtig vor?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
namespace ClassLibrary1
{
[Guid("E0BEF3E9-8297-4a69-BEC3-662451A620C2"),
InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIDispatch)]
public interface IVBTest
{
[DispId(1)] string testfunktion(string test);
[DispId(2)] int testfunktion2(int a, int b);
}
[Guid("8ABEFB55-19FA-4902-A9BF-834378F6AD75"),
ClassInterface(ClassInterfaceType.AutoDispatch),
ComSourceInterfaces(typeof(IVBTest))]
public class VBTest : IVBTest
{
public VBTest()
{
}
public string testfunktion(string test)
{
return test;
}
public int testfunktion2(int a, int b)
{
return a + b;
}
}
}
Sehr komisch ist aber, dass die IntelliSense von VB die beiden Funktion nicht anzeigt, die Funktionen aber aufgerufen werden können und auch funktionieren.
die Threads habe ich bereits mehrfach gelesen (bzw. mittlerweile könnte man auch studiert sagen).
Ich habe zwei Probleme:
1.) Ich kann die Klasse VBTest in VB6 nicht instanzieren (Laufzeitfehler 429)
2.) Die Klasse VBTest beinhaltet im VB6-Objektkatalog nicht die Funktion "testfunktion". Diese wird mir in VB6 als Teil der Interfaceklasse angezeigt. Meiner Meinung nach dürfte die Interfaceklasse in VB6 gar nicht auftauchen.
ich möchte gerne eine C#-DLL schreiben, die ich dann in VB einbinden kann.
Das Erstellen der Typelib funktioniert problemlos, und diese lässt sich auch in VB einbinden.
Allerdings wird mir meine Testmethode in VB in der Interface-Klasse IVBTest angezeigt, statt in der richtigen Klasse VBTest.
Instanzieren lässt sich die VBTest-Klasse auch nicht (Laufzeitfehler 429).
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
namespace ClassLibrary1
{
[Guid("E0BEF3E9-8297-4a69-BEC3-662451A620C2")]
public interface IVBTest
{
string testfunktion(string test);
}
[Guid("8ABEFB55-19FA-4902-A9BF-834378F6AD75"),
ClassInterface(ClassInterfaceType.None),
ComSourceInterfaces(typeof(IVBTest))]
public class VBTest : IVBTest
{
public VBTest()
{
}
public string testfunktion(string test)
{
return test;
}
}
}
VB6 läuft auf einem anderen Rechner als die .NET-Entwicklungsumgebung.