Laut BAK-REchner müsste ich jetzt tot sein...
Ich bin aber am leben! (Vielleicht bin ich einfach nur UNTOT oder bin [wie Jesus] von den Toten auferstanden - keine Ahnung).
Servus...
Para.
PS: Mein Rekord: Kasten Warsteiner + 1 Flasche Tequilla. Ich war 2 Tage lang nicht ansprechbar...
die startleiste befindet sich bei mir nicht unten sondern oben.
starte ich nun dein programm, habe ich keinen zugriff mehr auf sie (außer ich drücke diese komische windows-taste auf der tastatur).
vielleicht weiche ich etwas vom thema ab, bin aber gerade dabei mein erstes usercontrol zu erstellen und komme nicht weiter.
es geht um einen farbverlauf im usercontrol.
private Color colorBegin;
private Color colorFade;
getter und setter sind auch vorhanden:
[
Category("Farbverlauf")
RefreshProperties(RefreshProperties.All)
]
public Color setColor
{
get{ return this.colorBegin; }
set{ this.colorBegin = value; }
}
[
Category("Farbverlauf")
RefreshProperties(RefreshProperties.All)
]
public Color setFadeColor
{
get{ return this.colorFade; }
set{ this.colorFade = value; }
}
wenn ich nun das control in mein projekt einbinde, wird im designermodus alles richtig angezeigt. im eigenschafts-fenster kann ich die farben auch einstellen.
was mich stört ist, daß die veränderungen erst nach dem ausführen des programms angezeigt werden.
woran liegt das???
mit [RefreshProperties(RefreshProperties.All)] habe ich auch schon rumexperimentiert. hatte leider keinen erfolg.
@sunny
was meinst du mit "CodeOnFly".
könntest du vielleicht "CodeOnFly" näher erläutern?
Dein Code ist genau das, was ich gesucht habe.
Ich werde vielleicht noch die Hintergrundfarbe ändern damit das ganze etwas "aussagekräftiger" rübekommt.
Das ganze funktioniert wunderbar.
Nun würde ich gerene den Text, der schon eingegeben wurde, kurz aufblitzen lassen (kurzzeitig die Textfarbe auf Rot setzen).
Leider habe ich NULL Ahnung, wie ich das bewerkstelligen soll.
Ich habe es mit einer FOR-Schleife versucht - Reinfall.
Timer hat auch nicht hingehauen.
ich hätte da ne Frage: Gegeben sei eine doppelt verkette Liste.
public class List
{
class Link
{
public int item;
public Link prev, next;
public Link( int item )
{
this.item = item;
prev = next = null;
}
}
private Link head, last;
private int length;
public List()
{
head = last = null;
length = 0;
}
public List( int[] l )
{
add( l );
}
public List( List l )
{
add( l );
}
public bool isEmpty()
{
return head == null;
}
public int Length()
{
return length;;
}
public void add( int item )
{
if( isEmpty() )
{
head = new Link( item );
last = head;
length++;
}
else
{
Link tmp = last;
last.next = new Link( item );
last = last.next;
last.prev = tmp;
length++;
}
}
public void add( int[] l )
{
for( int i=0; i<l.Length; i++ ) add( l[i] );
}
public void add( List l )
{
Link current = l.head;
while( current != null )
{
add( current.item );
current = current.next;
}
}
public void delFirst()
{
if( !isEmpty() )
{
head = head.next;
head.prev = null;
length--;
}
}
public void delLast()
{
if( !isEmpty() )
{
last = last.prev;
last.next = null;
length--;
}
}
public void del( int item )
{
Link current = head;
while( current != null )
{
if( current.item == item )
{
if( current == head ) delFirst();
else if( current == last ) delLast();
else
{
current.prev.next = current.next;
current.next.prev = current.prev;
length--;
}
break;
}
current = current.next;
}
}
}
Ich erzeuge jetzt eine Liste, z.B. 1, 2, 3, 4, 5.
Nun lösche ich die 3 (current = 3)
3.prev.next = 3.next (=> 2.next = 4)
3.next.prev = 3.prev (=> 4.prev = 2)
Wenn ich nun die Liste durchlaufe, ist die "3" weg: 1, 2, 4, 5.
Soweit so gut...
Die "3" ist aber noch im Speicher und 3.prev zeit auf die 2, 3.next zeigt auf die 4.
Ist der GB klug genug, die "3" aus dem Speicher zu entfernen, oder muß ich die 3 manuell killen (z.B. so: 3.prev = null und 3.next = null)?
Danke für die Tipps.
Ich habe das Problem trotzdem nicht lösen können.
Da ich die Daten in eine XML-Datei speichern will (DataSert.WriteXML), laufe ich kurz vorm Speicher die Tabelle durch und sorge für eine korrekte Nummerierung (Ist zwar nicht die feine englische Art aber immerhin eine Lösung).
Servus...
Paratrooper.
PS: Das Ereignis "CurrentRowChanged" wir im DataTable und nicht in DataGrid ausgelöst.
Mir ist folgendes aufgefallen: Ich kann im DataGrid Daten eingeben. Es wird auch richtig mitgezählt (0, 1, 2, 3, 4 usw.).
Wenn ich nun mit der Pfeil-Taste eine Zeile nach oben gehe und dann wieder eine nach unten, stimmt die Nummerierung nicht mehr.
Beispiel: Ich gebe irgend etwas ein und drücke ENTER. DataGrid erzeugt eine neue Zeile. In der Spalte "Nr." steht jetzt ne 1. Ich gehe mit der Pfeiltaste nach oben und dann wieder nach unten. Nun steht in der zweiten Zeile eine 2 obwohl eine 1 stehen müßte (nach 0 kommt die 1). Komisch...
Ich würde gerne folgendes realisieren: Form1 ist gegeben. Per Button_Click wird ein neues Fenster geöffnet (Form2). Solange Form2 geöffnet ist, sollte Form1 nicht anklickbar sein (man kennt das aus vielen Programmen: Neues Fenster öffnet sich, das untergeordnete Fenster ist nicht anwählbar...)
@Frankenstein & Chief Brodie
Danke, hat wunderbar geklappt!
@VizOne
Dein Code ist natürlich einfacher und übersichtlicher. Werde wahrscheinlich auch so machen.
Aber: gegeben ist eine 3x3-Matrix. Wenn ich nun get(5,5) aufrufe, bricht das Programm ja ab, oder nicht?
Außerdem will ich die "throw new exception(blablabal)" durch eine MessageBox ersetzen (ob es einen Sinn hat, keine Ahnung).
Ich weiche nun ein bißchen vom Thema ab.
Ich habe ein paar selbstgeschriebene Klassen auf der Platte.
Die würde ich gerne in andere Projekte einfügen.
Wo muß ich die erzeugten dll's hinkopieren, damit ich sie mit "using" in mein neues Projekt einfügen kann?
Beispiel:
using System;
namespace LinAlg
{
public class Matrix
{
private double[,] M;
protected int m, n;
public Matrix()
{
m = n = 0;
M = new double[0,0];
}
public Matrix( int m, int n )
{
this.m = m;
this.n = n;
M = new double[m,n];
}
public Matrix( int m, int n, double[] A )
{
this.m = m;
this.n = n;
int count = 0;
M = new double[m,n];
for( int i=0; i<m; i++ )
{
for( int j=0; j<n; j++ )
{
M[i,j] = A[count];
count++;
}
}
}
public Matrix( double[,] A )
{
int m = A.Rank;
int n = A.Length / A.Rank;
M = new double[m,n];
for( int i=0; i<m; i++ )
{
for( int j=0; j<n; j++ ) M[i,j] = A[i,j];
}
}
public Matrix( Matrix A )
{
m = A.m;
n = A.n;
M = new double[m,n];
M = toArray( A );
}
public Matrix( int m, int n, double c )
{
this.m = m;
this.n = n;
M = new double[m,n];
for( int i=0; i<m; i++ )
{
for( int j=0; j<n; j++ ) M[i,j] = c;
}
}
public double get( int m, int n)
{
try
{
return M[m,n];
}
catch( Exception e )
{
throw new Exception( e.Message );
}
}
public void set( int m, int n, double item )
{
try
{
M[m,n] = item;
}
catch( Exception e )
{
throw new Exception( e.Message );
}
}
public void identity( int m, int n )
{
M = new double[m,n];
for( int i=0; i<m; i++ )
{
for( int j=0; j<n; j++ ) M[i,j] = (i==j) ? 1.0 : 0.0;
}
}
public void random( int m, int n )
{
M = new double[m,n];
Random r = new Random();
for( int i=0; i<m; i++ )
{
for( int j=0; j<n; j++ ) M[i,j] = r.NextDouble();
}
}
usw....
(Die Liste geht ewig weiter...)
Im Projektverzeichnis wird ein Unteverzeichniss ("bin\Debug") erstellt.
Darin befindet sich eine Datei namens "LinAlg.dll".
Wo muß ich die nun hinkopieren, damit ich sie in anderen Projekten nutzen kann?
ToString funktioniert immer noch nicht.
Die ToString-Methode war überschrieben. Habe nun deinen Code eingegeben. Die Ausgabe aber bleibt gleich ("System.Collections.ArrayList").
gibt es eine Möglichkeit, den Konstruktor in der Oberklasse aufzurufen?
Ich bin vor 4 Wochen von Java auf C# umgestiegen. Irgendwie kriege ich das nicht hin.
Beispiel Java:
Zitat
public class Punkt
{
private int x, y;
public Punkt() {
x = y = 0;
}
public Punkt( int x, int y ) {
this.x = x;
this.y = y;
}
public Punkt( Punkt p ) {
x = p.x;
y = p.y;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public void setXY( int x, int y ) {
this.x = x;
this.y = y;
}
public void move( int dx, int dy ) {
x += dx;
y += dy;
}
public void print() {
System.out.println( this );
}
public String toString() {
return "(" + x + "," + y + ")";
}
}
Zitat
public class Kreis extends Punkt
{
private int r;
public Kreis() {
super();
r = 1;
}
public Kreis( int x, int y, int r ) {
super(x,y);
this.r = r;
}
public Kreis( Punkt p, int r ) {
super(p);
this.r = r;
}
public int getR() {
return r;
}
public void setR(int r) {
this.r = r;
}
public void print() {
System.out.println(this);
}
public String toString() {
return "[" + super.toString() + "," + r + "]";
}
}
Wie ihr sehen könnt, rufe ich den Konstruktor der Oberklasse mit "super" auf.
In C# hbe ich das so gelöst:
Zitat
public class Kreis : Punkt
{
public int r;
public Kreis()
{
x = y = 0;
r = 1;
}
public Kreis( int x, int y, int r )
{
this.x = x;
this.y = y;
this.r = r;
}
public Kreis( Punkt p, int r )
{
x = p.x;
y = p.y;
this.r = r;
}
public override string ToString()
{
return "[" + base.ToString() + ", " + r + "]";
}
}
Irgendwie vermisse ich die "super"-Funktion.
Und noch eine Frage: Ich erstelle einen ArrayList L. L fülle ich nun mit "Punkten" auf z.B. L.Add( new Punkt(1,1) ) usw.
Console.WriteLine(L) gibt "System.Collections.ArrayList" aus (obwohl die ToString-Methode in "Punkt" implementiert ist).
Java hat mir immer eine saubere Liste auf meinen Bildschirm gezaubert...