Dann wird es wohl daran liegen, dass deine Methode CheckAll fehlerhaft ist. Wir können jetzt mal ins blaue raten, oder du postet mal ein bischen mehr Code, der deiner Meinung nach das Problem verursacht.
Wie poste ich richtig? (Punkt 5)
Sowas wie "da sind noch 2 Textboxen, die auch noch mitmachen", ist nicht ganz unwichtig. Denn sonst wäre deine Frage nach den ersten beiden Antworten beantwortet.
Gruss
Friedel
wenn alle 3 true sind wird button aktiv.
und zwar wenn mindestens ein element angehakt is aktivieren
Was den nun?
Ohne die Methode CheckAll() jetzt zu kennen, denke ich die ist nicht nötig/doppelt gemoppelt.
Gruss
Friedel
Ja:
button.Enabled = (clb.CheckedItems.Count > 0);
Gruss
Friedel
Hallo w1z4rd2003,
setz mal Klammern um die entsprechenden Gruppen von IDs.
Gruss
Friedel
Hallo baer999,
du überschreibst nicht das Event, sondern die Methoden, welche dieses Event normalerweise auslösen.
Ob du die Methoden der Basis aufrufst, hängt ganz davon ab, ob du die Funktionalität der Basismethoden brauchst, oder nicht. Bei OnPaint z.B. kannst du dein Control "normal" zeichnen lassen indem du die Basismethode aufrufst und danach zeichnest du in der Methode noch etwas zusätzliches "obendrauf".
Gruss
Friedel
Hallo Silvercircle,
dafür gibt es die Eigenschaft 'Anchor' und 'Dock', welche jedes Control besitzen.
Schau dir in der :rtfm: Doku mal an, was die bewirken.
Gruss
Friedel
Hallo Piko1977,
vermutlich hast du die Eigenschaft 'ColumnHeadersHeightSizeMode' auf AutoSize stehen.
Gruss
Friedel
Hallo,
nachdem ich jetzt nochmal etwas Zeit investiert habe, habe ich eine Lösung gefunden:
Talla:
Ilasm kennt doch nur den IL Code, woher soll es wissen welche Zeilen des im C# File entspricht?!?
Richtig, und deshlab muss man Ilasm das mitteilen. Genau genommen macht das Ildasm, indem man den Parameterflag /linenum setzt. Schon sind die Informationen für Ilasm bekannt und man kann die neu assemblierte Dll in VS debuggen, Breakpoints nutzen, usw.
Gruss
Friedel
ps.: Dank an herbivore und talla für die Hilfe und den Schubs in die richtige Richtung
Du findest sowas schneller raus, wenn du in der :rtfm: Doku nach TimeSpan schaust.
TimeSpan twoMinutes = new TimeSpan(0, 2, 0);
Gruss
Friedel
Weiss das jemand?
Wenn das noch eine Frage ist...
treeView.SelectedNode = nodeToAdd;
Gruss
Friedel
Hallo Orothred,
oh oh, das sind echte Grundlagen.
= ist ein Zuweisungsoperator
== ein Vergleichsoperator
Ein if-Statement verlagt einen boolschen Ausdruck und dies erreicht man mit Vergleichsoperatoren.
Gruss
Friedel
Hallo Pegasus2003,
die Antwort ist nodeToAdd.Tag 🙂
Gruss
Friedel
Sowas wie einen Filter kann man nicht anwenden, aber man kann in dem Bookmarks-Window Ordner und damit eine Struktur anlegen, welche einem das wiederfinden eines Bookmarks erheblich erleichtert.
Gruss
Friedel
Hallo wazer317,
auch Bookmarks können hier sehr hilfreich sein, gerade auch weil man im Bookmarks-Window alle übersichtlich zu sehen bekommt.
Gruss
Friedel
Hallo,
was knub sagt stimmt natürlich, aber du brauchst keine eigene Methode:
zum Beispiel
List<string> strings = new List<string>();
//...
List<string> tempStrings = new List<string>(strings);
//oder: List<string> tempStrings = new List<string>(strings.ToArray());
Gruss
Friedel
Hallo Orothred,
ich lasse ein verzeichnis überwachen
Also nutzt du den FileSystemWatcher?
Wenn ja, bekommst du ja schonmal mit, wenn eine Datei erstellt wird. Die benötigten Informationen würde ich in einer Instanz einer entsprechenden Klasse FileInfo (o.dergleichen) speichern. In diesem Objekt merkst du dir alle Infos, die du brauchst. Durch Serialisierung können die Informationen auch über die Laufzeit der Applikation erhalten bleiben.
Wann immer du es für richtig hälst, vergleichst du das derzeitige Datum mit dem Erstellungsdatum der Datei. Ist die Differenz über der festgelegten Zeitspanne, löscht du die Datei mit File.Delete.
Gruss
Friedel
Hallo,
das kommt wohl auch darauf an, wie du die nächste freie Stelle definierst.
(z.B.: darf etwas nicht mehr benötigtes überschrieben werden?)
Aber das was herbivore sagt trifft sicherlich zu...
Gruss
Friedel
Hallo Rosch,
versuch es mal mit
form.FormBorderStyle = FormBorderStyle.None;
form.ControlBox = false;
und evtl. mit:
form.Dock = DockStyle.Fill;
Gruss
Friedel
Hallo bd.cole,
schau mal nach Directory.GetFiles(...).
Gruss
Friedel
Hallo,
oder du nimmst das MouseDown-Event und merkst dir den Punkt, an welchem geklickt wurde, dort.
Gruss
Friedel
Hallo Second Sun,
wenn du eine Resourcen-Datei erstellt hast, in welche du das Programm eingebunden hast, wird das Programm dort als Byte-Array abgelegt.
Heraus bekommst du es dann so:
byte[] bytes = TestApp.Resource1.NameDesProgramms;
File.WriteAllBytes(@"c:\Test.exe", bytes);
Gruss
Friedel
Hallo emir,
nein, sorry, aber dazu gibt es schon etliche Threads.
Such mal nach System.Diagnostics.Process, oder schau in der :rtfm: Doku.
Gruss
Friedel
Hallo Orothred,
in der InnerException der Fehlermeldung steht, was beim aufruf einer Methode schief gegangen ist. Damit findest du den Fehler sicher schneller.
Gruss
Friedel
Hallo emir,
dafür gibt es ein Event
this.dataGridView1.CellDoubleClick +=
new DataGridViewCellEventHandler(dataGridView1_CellDoubleClick);
Im EventHandler kommst du mit
object obj = this.dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value;
an den Wert der Zelle, auf welcher doppelt geklickt wurde.
Gruss
Friedel
Hallo Orothred,
allerdings klappt es nicht beide plugins zu starten.
Gruss
Friedel
Dann ist das dataGridView1.UserDeletingRow-Event das richtige für dich.
Will der User nach Abfrage nicht mehr, e.Cancel = true setzen.
Gruss
Friedel
Hallo,
also zumindest bei der Pro Version liegt im Installationsordner ..\Microsoft Visual Studio 8\Common7\ die Datei VS2005ImageLibrary.zip, in welcher alle Icons enthalten sind.
Ob man die verwenden darf sichere ich hier natürlich nicht zu, würde mich aber wundern wenn nicht 8)
Warum sollte Microsoft auch was dagegen haben, Kunden die Microsoft und deren Icons gewohnt sind (auch in fremden Apps) bleiben länger treu...
Gruss
Friedel
Hallo Kasperdelasopa,
der Datensatz wird ja nicht einfach so gelöscht, irgendwas löst das ja aus.
Beispiel: Der User muss zum Löschen einer Zeile einen Button "Löschen" klicken. Also in dem EventHandler removeButton.Click den User Fragen, wenn bestätigt Datensatz löschen.
Also du musst da ansetzen, wo das Löschen vorgenommen wird, nicht danach
Gruss
Friedel
Hallo Kasperdelasopa,
die "kleinste" gemeinsame Basisklasse ist Control, also als Antwort auf deine Frage, gar nicht.
Warum willst du dies tun?
//Edit(x2):Treff die Tasten nicht...
Gruss
Friedel
Also ist doch klar was los ist, oder?
Du hast der Variablen nie einen Wert zugewiesen. Also:
httpMonitoringTimer = new Timer();
Oder besser, die Codezeile wird nicht erreicht.
Also mach sie erreichbar (z.B. Konstruktor)
Gruss
Friedel
Hallo Nullpunkt,
setze mal einen Breakpoint bei
httpMonitoringTimer.Interval = timerInterval; // HIER KOMMT DIE EXCEPTION
und schau dir an, welchen Wert httpMonitoringTimer hat.
Gruss
Friedel
Hallo mz7196,
direkt helfen kann ich dir leider nicht, aber eine Suche bei Google hilft manchmal weiter:
Goole Suche
Gruss
Friedel
Hallo Attenpeter,
irgendwo in einer Code-Datei -> rechte Maustaste -> Start Automatic Outlining
//edit: Fehler über Fehler
Gruss
Friedel
Oh, sorry hab ich glatt übersehen... 8o
Gruss
Friedel
Hallo,
ich würde es so machen:
int result = 0;
if (int.TryParse(textbox.Text, out result)) {
for (int i = 0; i < result; i++) {
//Code
}
} else {
MessageBox.Show("Bitte gültigen Zahlenwert eingeben !");
}
Anm.: einen Vergleich auf Empty-String (oder null) sollte man mit der statischen Methode IsNullOrEmpty machen:
string s = "Nicht leer";
bool leer = String.IsNullOrEmpty(s);
Gruss
Friedel
Hallo Bibi1911,
zu deinem Problem:
Nutze vielleicht besser das "dateTimePicker1_Validated"-Event.
zu deiner Frage:
leer geht nicht, da das Control immer eine DateTime anzeigt.
Du kannst aber das Anfangsdatum bestimmen, indem du dateTimePicker1.Value setzt und evtl. noch die Eigenschaften MinDate und MaxDate.
Gruss
Friedel
Hallo JuyJuka,
Vorsicht! -= funktionier nicht mi "new EventHandler(...)"
bei mir schon... 🙂
this.button1.Click += new EventHandler(button1_Click);
...
this.button1.Click -= new EventHandler(button1_Click);
Gruss
Friedel
Danke talla für deine Antwort.
Ich denke, ich verstehe was du meinst, nur dreh ich mich damit im Kreis. Mir ist es völlig egal, wo die pdb-Datei her kommt, welche zur "neuen", erweiterten DLL passt.
Das Ilasm das nicht leisten kann, verstehe ich ja, aber es muss trotzdem einen Weg geben, Breakpoints, usw. in der IDE (in der alten C# Code-Datei) zu nutzen, aber eben aufgesetzt auf die neue DLL.
Deshalb denke ich, dass ich wie oben bereits geschrieben habe zwischen die Compilierungsschritte muss.
Ob das geht, und wenn ja wie kriege ich schon noch raus.
Wäre natürlich trotzdem jedem dankbar, der mir Starthilfen in die richtige Richtung gibt.
Danke
Gruss
Friedel
Hallo talla,
ich lasse die pdb-Files ja von Ilsam generieren. Setze die Zeitstempel um (damit VS verkaukeln es wäre die "selbe" Datei) und starte die App. Mir ist bewußt, dass es keine entprechenden Codezeilen im C# Code gibt. Aber die ursprünglichen Zeilen sind ja noch da, eben nur verschoben. In der neuen .pdb-Datei sollte dies aber wieder stimmen. Nur VS nimmt diese Datei nicht an (Info bei Breakpoint: No Symbols have been loaded...).
Gruss
Friedel
Ok, danke herbivore.
Mit etwas Glück melden sich die beiden ja auf diesen Thread.
In der Zwischenzeit seh ich mir mal PostSharp an. Vielleicht kann man sich ja was abschauen.
Danke.
Gruss
Friedel
Ich habe ein Kommandozeilen-Tool geschrieben, welches eine DLL Diassembliert, den IL-Code auswertet, an bestimmten Stellen IL-Code einfügt und den Code dann wieder Kompiliert (exe, dll). Dieses Tool kann ich nun per Post Build Event aufrufen und das Tool macht was es soll. Funktioniert auch; nur die PDB-Datei passt eben nicht mehr zur "neuen" dll, obwohl ich die pdb-Datei ebenfalls neu erstellen lasse. VS interessiert das leider nicht. Auch das Setzen der Zeitstempel bringt mich (im Gegensatz zur dll) bei der .PDB-Datei nicht weiter.
Also ist es nicht mehr möglich zu debuggen, breakpoints zu setzen, usw. Das ist allerdings zwingend nötig wie du dir sicher vorstellen kannst.
Aus diesem Grund möchte ich eben "dazwischen".
Gruss
Friedel
Hallo herbivore, und danke...
Also anders:
Durch targets kann ich mich in den Build-Prozess von VS "einmischen".
Vereinfacht stell ich mir den Build-Prozess so vor:
C#-Code -> MSIL -> .dll
Ist es möglich zwischen MSIL und .dll zu kommen? Wenn ja wo ist dieser Schritt in der Common.target gibt es einen Schritt CoreCompile, aber leider komme ich nicht tiefer an die Stelle, wo der MSIL Code vorliegt, die DLL aber nocht nicht.
Gibt es diesen Zwischenschritt in den targets überhaupt ?
Gruss
Friedel
Hallo,
ist es möglich aus einer bestehenden DLL eine PDB Datei zu erzeugen und diese direkt für die IDE (zum Debuggen) bereitszustellen?
Danke
Gruss
Friedel
Welchen Programmierer interessiert schon wie schnell man komplette Wörter und Sätze schreiben kann? Dank Intellisense braucht man ja nur die ersten Buchstaben, und evtl. die Pfeiltasten. 🙂
Ausserhalb der Ide reichen meine "Tippkünste" mit 4-6 Fingern (wobei ich seltsamerweise auch die kleinen Finger nutze) aus, um schneller zu sein als so mancher mit seinen 10 Fingern.
Gruss
Friedel
Hallo mipa_acc,
das kommt darauf an, wo du dich im Code befindest. Hast du z.B. eine Instanz einer Form (form1) kannst du diese mit form1.Close() schliessen.
Gruss
Friedel
Hallo herbivore,
danke für deine Antworten.
Nachdem mich dieser new-Modifier ein paar Stunden meiner Lebenszeit gekostet hat, werde ich ab jetzt ebenfalls gegen dieses wettern.
Ein Enhancer ansich OK, allerdings kann dieser Schritt theoretisch vergessen werden, anders als ein (dynamischer,) zur Laufzeit erstellter Typ. Aber gut, da finde ich auch noch was.
Also nochmals Danke.
//edit: Stimmt, ein Enhancer "sitzt" zwischen dem Kompilieren und dem Start der Applikation.
Gruss
Friedel
Hallo herbivore,
hast natürlich recht... 🙁
Das ich das übersehen habe, ist ja fast schon ein bischen peinlich, aber eben auch nur fast.
Das es so ist , ist allerdings schlecht für mich.
Ich gehe auch mal stark davon aus, dass es keine Möglichkeit gibt, ausser evtl. mit einem Enhancer, einen statischen Typ zur quasi Laufzeit zu erstellen, oder?
Ich kann nämlich nicht (weiter) mit Reflection arbeiten. Der Nutzer der Klasse soll gar nicht bemerken, dass er nicht mit dem ursprünglichen Objekt arbeitet, sondern mit einem SubType (zumal das Ganze ja zur Laufzeit, oder zumindest nach dem Kompilieren passieren soll).
Gruss
Friedel
Für alle die es interessiert, wie man mit Emit überhaupt was erreicht:
private void createDynamicASM() {
TestClass class1 = new TestClass("Eine TestKlasse");
AppDomain domain = System.Threading.Thread.GetDomain();
AssemblyBuilder asmBuilder = domain.DefineDynamicAssembly(
new System.Reflection.AssemblyName("TestAsm"), AssemblyBuilderAccess.RunAndSave);
ModuleBuilder mBuilder = asmBuilder.DefineDynamicModule("TestModule");
TypeBuilder tBuilder = mBuilder.DefineType("TestType", System.Reflection.TypeAttributes.Public,
class1.GetType());
tBuilder.DefineProperty("TestProperty", System.Reflection.PropertyAttributes.None,
typeof(string), new Type[] { typeof(string) });
PropertyBuilder pNameBuilder = tBuilder.DefineProperty("Name",
System.Reflection.PropertyAttributes.SpecialName,
typeof(string), new Type[] { typeof(string) });
FieldBuilder fNameBuilder =
tBuilder.DefineField("name", typeof(string), FieldAttributes.Private);
Type objType = Type.GetType("System.Object");
ConstructorInfo objCtor = objType.GetConstructor(Type.EmptyTypes);
ConstructorBuilder ctorBuilder = tBuilder.DefineConstructor(
System.Reflection.MethodAttributes.Public,
System.Reflection.CallingConventions.Standard,
new Type[] { typeof(string) });
ILGenerator ctorGen = ctorBuilder.GetILGenerator();
ctorGen.Emit(OpCodes.Ldarg_0);
ctorGen.Emit(OpCodes.Call, objCtor);
ctorGen.Emit(OpCodes.Ldarg_0);
ctorGen.Emit(OpCodes.Ldarg_1);
ctorGen.Emit(OpCodes.Stfld, fNameBuilder);
ctorGen.Emit(OpCodes.Ret);
MethodBuilder getNameMeth = tBuilder.DefineMethod("get_Name",
MethodAttributes.Private | MethodAttributes.HideBySig,
typeof(string), null);
PropertyInfo baseGetName = class1.GetType().GetProperty("Name");
MethodInfo getInfo = baseGetName.GetGetMethod();
ILGenerator getNameMethGen = getNameMeth.GetILGenerator();
getNameMethGen.Emit(OpCodes.Ldarg_0);
getNameMethGen.Emit(OpCodes.Call, fNameBuilder);
getNameMethGen.Emit(OpCodes.Ret);
pNameBuilder.SetGetMethod(getNameMeth);
Type t = tBuilder.CreateType();
System.Reflection.ConstructorInfo info = t.GetConstructor(new Type[] { typeof(string) });
object z = info.Invoke(new object[] { "Eine neue TestKlasse" });
if (z.GetType().IsSubclassOf(typeof(TestClass))) {
class1 = (TestClass)z;
string s = class1.Name; //Hier sollte s = "Eine neue TestKlasse" sein, ist aber null
}
}
TestClass:
public class TestClass : TestInterface {
private string name;
private int value;
public TestClass() : this(String.Empty) { }
public TestClass(string name) : this(name, 0) { }
public TestClass(string name, int value) {
this.name = name;
this.value = value;
}
public void TestMethod() {
}
public string Name {
get { return this.name; }
set { this.name = value; }
}
public int Value {
get { return this.value; }
set { this.value = value; }
}
}
Wie man "sieht", wird die Eigenschaft Name nicht überschrieben, sondern erneut angelegt. Das nützt mir allerdings gar nichts.
Bin für jeden Tip dankbar...
Gruss
Friedel