Laden...
Avatar #avatar-1931.jpg
Friedel myCSharp.de - Member
Nähe Kassel / Hessen Dabei seit 19.08.2005 830 Beiträge
Benutzerbeschreibung

Forenbeiträge von Friedel Ingesamt 830 Beiträge

21.09.2006 - 20:39 Uhr

Hallo Nevermind,

ohne mir jetzt alles durchgelesen zu haben...


myReader = myCommand.ExecuteReader();
while (myReader.Read())
{
   info = (myReader.GetString(0));
}
return info;

in dieser Methode (? wenn es eine ist) liest du immer wieder einen String aus einem Reader in ein und die selbe Variable (wird immer wieder überschrieben).
Du willst aber eine ganze 'Liste' an strings haben, also


List<string> infos = new List<string>();
myReader = myCommand.ExecuteReader();
while (myReader.Read())
{
   infos.Add(myReader.GetString(0));
}
return infos;

Natürlich ändert sich der Rückgabewert der Methode auf List<string>.

Anlegen der Items:


for (int i = 1; i <= Convert.ToInt32(count); i++)
{
   List<string> items = conn1.reader();
   foreach(string item in items)
      listBox1.Items.Add(item);
}

Gruss
Friedel

21.09.2006 - 18:27 Uhr

In einer neuen Zeile habe ich das noch gar nicht probiert (peinlich), aber stimmt dann tritt der Effekt auf.

base.ColumnStartedEditing(textBox);

löst dieses Problem aus. Die Methode ist zwar virtual, aber die zu überschreiben, wird mehr als schwierig, da diese viele Objekte aus dem System.Windows.Forms Namespace nutzt, welche als internal markiert sind.

Als Workaround :


private void TextBoxTextChanged(object sender, EventArgs e)
{
     string tempString = textBox.Text;   //<<<<<<<
     textBox.TextChanged -= new EventHandler(TextBoxTextChanged);
     this.isEditing = true;
     base.ColumnStartedEditing(textBox);
     textBox.Text = tempString;  //<<<<<<
     textBox.SelectionStart = tempString.Length;
}

entsprechend ändern und der Effekt wird "versteckt".

//edit: "textBox.SelectionStart = tempString.Length;" vergessen.

Gruss
Friedel

21.09.2006 - 10:23 Uhr

Habe mit Copy & Paste alles nochmal neu erstellt und wie gesagt, bei mir legt er direkt mit dem ersten Buchstaben los.

Gruss
Friedel

20.09.2006 - 13:04 Uhr

Hallo blucat,

Antwort wurde doch schon 2 mal genannt:


DataColumn col;
...
for (int i = 0;i < reader.FieldCount - 1;i++)
{
     col= new DataColumn();  //<<<<<<<<<<<<<<<<<<<<
     col.ColumnName = reader.GetName(i);
     col.DataType = reader.GetFieldType(i);
     dt.Columns.Add(col);
}

Gruss
Friedel

20.09.2006 - 12:20 Uhr

Du brauchst doch gar nicht viel im vorhandenen Quellcode ändern, da sowohl die original als auch die neue TextBox von DataGridColumnStyle erbt.

wenn ich auf ein feld klicke und anfange zu schreiben, dann schreibt er erst los bei zweiten gedrückten buchstaben, daher:

bei mir nicht...

Gruss
Friedel

20.09.2006 - 10:46 Uhr

Hallo Afrokalypse,

also in der Pro Version ist das unter:

Tools-> Options -> Text Editor -> C# / LineNumbers

20.09.2006 - 10:00 Uhr

Hallo herbivore,

ja ne, is klar 🙂

Aber eine Tabelle aus einer Datenbank in einem PropertyGrid anzuzeigen finde ich ein wenig abstrus und habe ich so noch nie gesehen. Dinge wie sortieren, editieren löschen, hinzufügen, usw. werden doch dadurch unnötig erschwert.
Wenn die Daten aus der DB allerdings dazu genutzt werden ein Objekt zu initialisieren und das soll angezeigt werden, ok.

Gruss
Friedel

20.09.2006 - 09:53 Uhr

Hast du dir die Doku zu DataSet.Merge schon mal angeschaut ?

Link

Gruss
Friedel

20.09.2006 - 09:42 Uhr

Nur intressehalber:

Warum zeigst du Daten in einem PropertyGrid an und nicht in einem DataGrid/-view ?
Das PropertyGrid ist doch eigentlich für Objekte und nicht für Daten.

Gruss
Friedel

20.09.2006 - 08:17 Uhr

Finde es eigentlich ästhetischer, ein neues "fehlerfreies" Control zu schreiben, als in einem vorhandenem "falschen" so lange rumzuwurschteln, bis es ungefähr das macht, was ich will. 🙂

Gruss
Friedel

19.09.2006 - 23:15 Uhr

Hallo albatros.

Finde es anderen Usern gegenüber nicht gut/fair, wenn man direkt einer Person dankt, bevor überhaupt eine Antwort geschrieben wurde.
Natürlich weiß herbivore sehr viel, aber eben auch nicht alles. Ich sehe aber mal darüber weg und versuche dir trotzdem zu helfen.

Im Internet habe ich, wie du oben bereits geschrieben hast nur gefunden, dass die DataGridTextBoxColumn wohl sehr fehlerhaft ist.
Aus diesem Grund habe ich mir mal eine eigene DataGridTextBoxColumn erstellt. Diese ist von DataGridColumnStyle abgeleitet.


public class CustomDataGridTextBoxColumn : DataGridColumnStyle
    {
        private bool isEditing;
        private CustomTextBoxControl textBox = new CustomTextBoxControl();

        public CustomDataGridTextBoxColumn()
            : base()
        {
            textBox.Visible = false;
        }

        public TextBox TextBox
        {
            get { return this.textBox; }
        }

        protected override void Abort(int rowNum)
        {
            isEditing = false;
            textBox.TextChanged -= new EventHandler(TextBoxTextChanged);
            Invalidate();
        }

        protected override bool Commit(CurrencyManager dataSource, int rowNum)
        {
            textBox.Bounds = Rectangle.Empty;
            textBox.TextChanged -= new EventHandler(TextBoxTextChanged);

            if (!isEditing)
                return true;

            isEditing = false;

            try
            {
                string value = textBox.Text;
                SetColumnValueAtRow(dataSource, rowNum, value);
            }
            catch (Exception)
            {
                Abort(rowNum);
                return false;
            }

            Invalidate();
            return true;
        }

        protected override void Edit(CurrencyManager source, int rowNum, System.Drawing.Rectangle bounds, bool readOnly, string displayText, bool cellIsVisible)
        {
            string value = (string)GetColumnValueAtRow(source, rowNum);
            if (cellIsVisible)
            {
                textBox.Bounds = new Rectangle(
                    bounds.X + 2, bounds.Y + 2, bounds.Width - 4, bounds.Height - 4);
                textBox.Text = value;
                textBox.Visible = true;
                textBox.TextChanged += new EventHandler(TextBoxTextChanged);
            }
            else 
            {
                textBox.Text = value;
                textBox.Visible = false;
            }

            if (textBox.Visible)
                DataGridTableStyle.DataGrid.Invalidate(bounds);

            textBox.Focus();
        }

        protected override int GetMinimumHeight()
        {
            return textBox.PreferredHeight + 4;
        }

        protected override int GetPreferredHeight(System.Drawing.Graphics g, object value)
        {
            return textBox.PreferredHeight + 4;
        }

        protected override System.Drawing.Size GetPreferredSize(System.Drawing.Graphics g, object value)
        {
            return new Size(100, textBox.PreferredHeight + 4);
        }

        protected override void Paint(Graphics g, Rectangle bounds, CurrencyManager source, int rowNum)
        {
            Paint(g, bounds, source, rowNum, false);
        }

        protected override void Paint(Graphics g, Rectangle bounds, CurrencyManager source, int rowNum, 
            bool alignToRight)
        {
            Paint(
            g, bounds,
            source,
            rowNum,
            Brushes.Red,
            Brushes.Blue,
            alignToRight);
        }

        protected override void Paint(Graphics g, Rectangle bounds, CurrencyManager source, int rowNum, 
            Brush backBrush, Brush foreBrush, bool alignToRight)
        {
            string value = (string)GetColumnValueAtRow(source, rowNum);
            Rectangle rect = bounds;
            g.FillRectangle(backBrush, rect);
            rect.Offset(0, 2);
            rect.Height -= 2;
            g.DrawString(value, this.DataGridTableStyle.DataGrid.Font, foreBrush, rect);
        }

        protected override void SetDataGridInColumn(DataGrid value)
        {
            base.SetDataGridInColumn(value);
            if (textBox.Parent != null)
            {
                textBox.Parent.Controls.Remove
                    (textBox);
            }
            if (value != null)
            {
                value.Controls.Add(textBox);
            }
        }

        private void TextBoxTextChanged(object sender, EventArgs e)
        {
            textBox.TextChanged -= new EventHandler(TextBoxTextChanged);
            this.isEditing = true;
            base.ColumnStartedEditing(textBox);
        }
    }

Diese Klasse kapselt ein CustomTextBoxContol


public class CustomTextBoxControl : TextBox
    {
        protected override bool ProcessKeyMessage(ref Message m)
        {
            return ProcessKeyEventArgs(ref m);
        }
    }

Angewendet wird die CustomDataGridTextBoxColumn z.B. so:


public class MyForm : Form
    {
        private DataTable namesDataTable;
        private DataGrid grid = new DataGrid();
        public MyForm()
            : base()
        {
            InitForm();

            namesDataTable = new DataTable("NamesTable");
            namesDataTable.Columns.Add(new DataColumn("Name"));
            DataColumn dateColumn = new DataColumn
                ("Value", typeof(string));
            dateColumn.DefaultValue = "Default";
            namesDataTable.Columns.Add(dateColumn);
            DataSet namesDataSet = new DataSet();
            namesDataSet.Tables.Add(namesDataTable);
            grid.DataSource = namesDataSet;
            grid.DataMember = "NamesTable";
            AddGridStyle();
            AddData();
        }

        private void AddGridStyle()
        {
            DataGridTableStyle myGridStyle = new DataGridTableStyle();
            myGridStyle.MappingName = "NamesTable";

            DataGridTextBoxColumn nameColumnStyle =
                new DataGridTextBoxColumn();
            nameColumnStyle.MappingName = "Name";
            nameColumnStyle.HeaderText = "Name";
            myGridStyle.GridColumnStyles.Add(nameColumnStyle);

            CustomDataGridTextBoxColumn textBoxColumn = new CustomDataGridTextBoxColumn();
            textBoxColumn.MappingName = "Value";
            textBoxColumn.HeaderText = "Value";
            textBoxColumn.Width = 100;

            AutoCompleteStringCollection acs = new AutoCompleteStringCollection();
            acs.AddRange(new string[] { "Hallo Welt", "Hallo Nachbar", "Eintracht", "Pyramide" });

            textBoxColumn.TextBox.AutoCompleteCustomSource = acs;
            textBoxColumn.TextBox.AutoCompleteMode = AutoCompleteMode.Suggest;
            textBoxColumn.TextBox.AutoCompleteSource = AutoCompleteSource.CustomSource;

            myGridStyle.GridColumnStyles.Add(textBoxColumn);

            grid.TableStyles.Add(myGridStyle);
        }

        private void AddData()
        {
            DataRow dRow = namesDataTable.NewRow();
            dRow["Name"] = "Name 1";
            dRow["Value"] = "Value1";
            namesDataTable.Rows.Add(dRow);

            dRow = namesDataTable.NewRow();
            dRow["Name"] = "Name 2";
            dRow["Value"] = "Value2";
            namesDataTable.Rows.Add(dRow);

            dRow = namesDataTable.NewRow();
            dRow["Name"] = "Name 3";
            dRow["Value"] = "Value3";
            namesDataTable.Rows.Add(dRow);

            dRow = namesDataTable.NewRow();
            dRow["Name"] = "Name 4";
            dRow["Value"] = "Value4";
            namesDataTable.Rows.Add(dRow);

            dRow = namesDataTable.NewRow();
            dRow["Name"] = "Name 5";
            dRow["Value"] = "Value5";
            namesDataTable.Rows.Add(dRow);

            namesDataTable.AcceptChanges();
        }

        private void InitForm()
        {
            this.Size = new System.Drawing.Size(500, 500);
            grid.Size = new System.Drawing.Size(350, 250);
            grid.TabStop = true;
            grid.TabIndex = 1;
            grid.Dock = DockStyle.Fill;
            this.StartPosition = FormStartPosition.CenterScreen;
            this.Controls.Add(grid);
        }
    }

In der Form gibt es ein DataGrid mit zwei Columns. Die Column "Value" ist AutoComplete fähig. Versuch es mit den Worten "Hallo Welt", "Hallo Nachbar", "Eintracht", "Pyramide".

Die Eigenschaft

textBox.AutoCompleteMode = AutoCompleteMode.Append;

legt fest, wie dem User die Möglichkeiten angezeigt werden sollen.

Hoffe das hilft.

Gruss
Friedel

19.09.2006 - 20:01 Uhr

Hallo vbtricks,

einfach

[assembly: AssemblyFileVersion("1.2.*")]

löschen.

Warum ? Keine Ahnung aber es funzt.

Gruss
Friedel

19.09.2006 - 19:46 Uhr

Hallo Downhill,

das sollte doch funzen, oder ?

public Form1()
{
    InitializeComponent();
    Thread thread = new Thread(new ThreadStart(StartAppDomainAsync));
    thread.Start();
}

public void StartAppDomainAsync()
{
    AppDomain apd = AppDomain.CreateDomain("Test");
    apd.ExecuteAssembly(@"D:\Test.exe");
}

Gruss
Friedel

19.09.2006 - 19:30 Uhr

Hallo stonecold,

Wie vergleiche ich die DataTable von gestern mit der DataTable von heute z.B.?

Das kommt darauf an, ob dein Programm durchläuft, oder ob es "jedesmal" neu gestartet wird.

Wenn das Programm durchläuft, lädst du die "neuen" Daten aus der Datenbank in ein seperates DataSet. Mit der Methode

altesDataSet.Merge(neuesDataSet)

wird dein altes DataSet aktualisiert. Ab dann kannst du mit der Methode

DataSet modRows = altesDataSet.GetChanges(DataRowState.Modified)

ein neues DataSet abfragen, welches nur die geänderten Datensätze enthält.

Wenn das Programm nicht durchläuft, wirst du dein DataSet, z.B. mit

altesDataSet.WriteXml(@"c:\Temp\dataSet_2006_09_19.xml", XmlWriteMode.DiffGram);

speichern und beim nächsten Abfragen der Daten wiederherstellen müssen.

Eine elegantere Lösung wäre sicherlich, in der Spalte, welche den String "geändert" enthält keinen String, sondern ein DateTime-Wert zu speichern, und eben nur den relevanten Zeitraum abzugfragen, z.B. in Pseudo 'between 2006_09_19 00:00:00 and 2006_09_19 23:59:59'

Gruss
Friedel

31.08.2006 - 10:33 Uhr

lt. MSDN:

Versionsinformationen

.NET Framework
Unterstützt in: 2.0, 1.1, 1.0
.NET Compact Framework
Unterstützt in: 2.0

Sollte also auch in 2003 gehen, denke ich. Nur im Compact Framework gibt es die Eigenschaft erst in V2.0

Gruss
Friedel

31.08.2006 - 10:27 Uhr

Verlässt du dich nur auf die Intellisense, oder gibt es eine Fehlermeldung.
Also wenn es das nicht gibt, kann ich dir nicht helfen. Das würde ja bedeuten, das die DLL aus welcher System.Windows.Forms kommt nicht in Ordnung ist.

Gehe mal davon aus, dass du VS2005 nutzt. Unter References muss die Referenz auf die DLL System.Windows.Forms vorhanden sein, aber die wird eigentlich immer automatisch referenziert, wenn du eine Form anlegst.

Gruss
Friedel

31.08.2006 - 10:17 Uhr

public class fAufträge : System.Windows.Forms.Form
	{
		private System.Windows.Forms.Label lblgescannteAufträge;
		private System.Windows.Forms.Button btnLöschen;
		private System.Windows.Forms.Button btnBearbeiten;
		private System.Windows.Forms.ListBox libAuftragsbox;
		private System.Windows.Forms.Panel panel1;
		private System.Windows.Forms.MainMenu mainMenu1;
		private System.Windows.Forms.MenuItem menuItem1;
		private System.Windows.Forms.MenuItem menuItem2;
						
		public fAufträge()
		{
			//
			// Erforderlich für die Windows Form-Designerunterstützung
			//
			InitializeComponent(); 

                        this.KeyPreview = true; 

			cProgramm.m_Aufträge = this;
		}
                ...
}

31.08.2006 - 10:10 Uhr

Mit was programmierst du ?

System.Windows.Forms.Form hat die Eigenschaft KeyPreview in 1.0, 1.1, 2.0

31.08.2006 - 09:59 Uhr

In der Form, im Konstruktor nach InitializeComponents() this.KeyPreview = true setzten.

//edit:
Oder im Designer die Form markieren und die Eigenschaft setzen.

31.08.2006 - 09:53 Uhr

Das bringt die Listbox doch schon mit. Einen Eintrag makieren und Tasten drücken, fertig.
Mit dem Event SelectedIndexChanged bekommst du das mit und mit SelectedItem das markierte Element.

31.08.2006 - 09:35 Uhr

Hallo dgroeser,

zu 1

form1.KeyPreview = true;

die 2. Frage verstehe ich nicht. Was meinst du mit "durchblättern" ?

Gruss
Friedel

25.08.2006 - 14:37 Uhr

Auch noch stolz drauf 8)

Gruss
Friedel

25.08.2006 - 14:16 Uhr

Hallo Herbivore

und danke für deine Antwort.

Habe mir mir die Sache nochmal angeschaut. Obwohl bei mir im GAC bereits Resourcen dlls liegen, z.B. Oracle scheint das so zu machen, finde ich die Lösung nicht so toll. Es gibt dlls die von diversen Programmen genutzt werden, allerdings finde ich das Erweitern der Suche nach Assemblies durch die Runtime besser.

Danke.

Gruss
Friedel

22.08.2006 - 11:54 Uhr

Hallo,

ich habe eine DLL mit einer Oberfläche, welche lokalisiert ist. Diese DLL soll/muss in den GAC. Normalerweise habe ich im Anwendungsordner mehrere Unterordner, welche die DLLs für die Lokalisierung enthalten. Was aber, wenn es keinen Programmordner gibt? Wo müssen z.B. die DLLs aus dem Ordner "de" hin, um gefunden zu werden?
Auch in den GAC, oder gibt es eine bessere Möglichkeit ?

Danke für jeden Tip

Gruss
Friedel

21.08.2006 - 12:34 Uhr

Hallo Fischi,

bin mir nicht ganz sicher, aber die Methode IndexOf wird sicherlich die Methode Equals eines Objektes aufrufen. Also musst du diese in deinen Klassen (A,B) überschreiben. Dann muss der Aufruf aber eigentlich so aussehen:

MyCollection.IndexOf((B)einObjektvomTypB);

//Edit:
Eigentlich sollte aber :

MyCollection.IndexOf(einObjektvomTypB);

auch funzen

Gruss
Friedel

16.08.2006 - 19:13 Uhr

Hallo SimonKnight6600,

auch ich finde das Tutorial wirklich gelungen.

Eine Sache vermisse ich aber bei dem Kapitel "Dateien lesen und schreiben", und zwar wie eine Textdatei erweitert werden kann, also die Benutzung der Methode Seek(...). Sicherlich nur eine Kleinigkeit, macht die Sache aber vollständiger, denke ich.

Gruss
Friedel

11.08.2006 - 14:24 Uhr

Hallo TiTime,

Ich weiß das es das Event Form.Close oder Closing gibt, aber das brauch ich nicht.

Wieso brauchst du das nicht?
In dem/den Event/s kannst du doch alles machen was du willst, neue Form, andere Funktionalität. Soll deine Form nicht geschlossen werden, setzt du in dem Event Closing e.Cancel = true und machst, was immer du für richtig hälst.

Gruss
Friedel

11.08.2006 - 11:03 Uhr

Habt recht.
Vielleicht sollte man erst mal denken und dann antworten 8)

Sorry

Gruss
Friedel

10.08.2006 - 18:32 Uhr

Hallo redMars,


// DataChanged-Ereignis für alle OPC-Verbindungen
private void wrapper_itemDataChanged(object sender, DataChangedEventArgs e)
	{
        if(button1_Click != null)  //<< Wichtig beim Benutzen von Events;
		   button1_Click(this, new EventArgs());
    }
// Button zum Testen
private void button1_Click(object sender, System.EventArgs e)
	{
		DataRow newRow = opcDataTable.NewRow();
		newRow["Typ"] = "bool";
		opcDataTable.Rows.Add(newRow);
	}

Gruss
Friedel

08.08.2006 - 16:25 Uhr

Hallo diver,

auch hier verstehe ich deine Problembeschreibung nicht so ganz 🙂

Auch das lässt sich über TabPages realisieren. Den TreeNodes als Tag wieder die entsprechende Seite zuweisen (ist flexibler als der Index) und beim Selektieren das TabControl veranlassen auf die gewünschte TabPage zu wechseln, auf welcher die für diesen Node relevanten Controls (PictureBox, ListView, usw.) enthalten sind.

Gruss
Friedel

08.08.2006 - 13:08 Uhr

Hallo diver,

nachdem ich den Text zweimal gelesen habe, hoffe ich, ich verstehe dein Problem richtig.

Ich denke sowas realisiert man am besten mit TabPages. Den "ToolBarButtons" könnte man z.B. als TAG die jeweilige TabPage zuweisen. Wird der Button geklickt, veranlasst du, dass die entsprechende Seite im TabControl angewählt wird.

Gruss
Friedel

08.08.2006 - 10:03 Uhr

Original von Second Sun
aber kein thema passt zu meiner antowrt und es ist schon garkein code dabei**!!!**

Ein bisschen Eigeninitiative wird man wohl erwarten dürfen !

Gruss
Friedel

07.08.2006 - 21:31 Uhr

Hallo Second Sun,

solche Fragen gab es schon mehrfach.
Versuch mal mit der Suche etwas passendes zu finden.

Suche Webcam

Gruss
Friedel

06.08.2006 - 11:44 Uhr

Hallo,

ich bin generell auch der Meinung, dass ein Studium nur von Vorteil sein kann. Das Problem ist allerdings, ein Studium ist nicht ganz einfach, wenn man selber für die Finazierung aufkommen muss. Man sollte sich genau überlegen, ob man 80 - 120 Stunden im Monat arbeiten kann und trotzdem noch die Disziplin hat danach nochmal den selben Aufwand an Stunden in das Studium zu stecken. Unsere Politiker machen die Sache ja nicht gerade einfacher mit den m.E. dämlichen Studiengebühren.
Sollte man diese Hürde aber genommen haben, denke ich, dass man vielleicht nicht fachlich besser ist als ein "gelernter" Informatiker, aber auf jeden Fall "gereifter". Ein Studium verlangt eine Menge Eigeninitiative, die einem in einer Ausbildung komplett genommen wird.
Ich denke, aber das ist nur meine Meinung, man sollte vorher eine Ausbildung machen. Am besten in einem anderen Bereich. Informatik besteht nicht nur aus Programmieren, im Gegenteil. Das Proggen steht sogar ziemlich im Hintergrund. Die ersten 2-3 Semester bekommt man so gut wie keinen PC in der Uni zu sehen (zumindest war das bei mir so), sondern man lernt Mathematik neu kennen.
In den ersten Semstern meines Studiums waren wir ca 350 Leute. Den Abschluss haben gerade mal ca 100 Leute gemacht. Der Rest ist auf der Strecke geblieben. Dehalb ist es denke ich nicht verkehrt, einen komplett anderen Weg einschlagen zu können, wenn das Studium nicht so verläuft wie man sich das vorgestellt hat.

Gruss
Friedel

//edit: Fehler korregiert 🙂

02.08.2006 - 11:28 Uhr

Hallo,

also bei mir funzt das ohne Probleme.

Du musst für jedes Control ein eigenes ToolTip-Objekt anlegen.

Gruss
Friedel

02.08.2006 - 08:37 Uhr

// EDIT: voll verlesen, SORRY ! Trotzdem lasse ich den Code mal drin.


public void Egal() {
   System.Collections.ArrayList fileList = new System.Collections.ArrayList();
   foreach (string fileName in System.IO.Directory.GetFiles(@"C:\TestDirect"))       
      fileList.Add(new Datei(fileName, System.IO.Directory.GetCreationTime(fileName)));
    

     Array.Sort(fileList, new Comparer());
}

        ...

public class Datei {
     private string fileName;
     private DateTime creationTime;

      public Datei(string fileName, DateTime creationTime) {
          this.fileName = fileName;
          this.creationTime = creationTime;
      }

      public DateTime CreationTime {
           get { return this.creationTime; }
       }

       public string FileName {
           get { return this.fileName; }
       }
}

        ...

public class Comparer : System.Collections.IComparer {
       #region IComparer Members

       public int Compare(object x, object y) {
           if (x is Datei && y is Datei) {
              Datei dateiX = (Datei)x;
              Datei dateiY = (Datei)y;

               return dateiX.CreationTime.CompareTo(dateiY.CreationTime);
            }
        }

        #endregion
}

Gruss
Friedel

01.08.2006 - 12:49 Uhr

Hallo,

danke @Lord Hessia, mit deiner Hilfe habe ich sowas hinbekommen, was genau das macht was ich will.


SELECT TestSteps.ID, TestSteps.Name, TestStepAttribs.Value AS Sequence, null as Sequence_A INTO temp 
FROM TestSteps,TestStepAttribs, TestStepAttribDefs 
WHERE TestStepAttribs.AttribDefID = TestStepAttribDefs.ID AND 
TestSteps.ID = TestStepAttribs.TestStepID AND 
TestStepAttribs.Value = 'CO' AND TestStepAttribDefs.Name = 'Sequence'

UNION ALL

SELECT TestSteps.ID, TestSteps.Name, null AS Sequence, TestStepAttribs.Value AS Sequence_A
FROM TestSteps,TestStepAttribs, TestStepAttribDefs 
WHERE TestStepAttribs.AttribDefID = TestStepAttribDefs.ID AND 
TestSteps.ID = TestStepAttribs.TestStepID AND 
TestStepAttribs.Value = 'Test' AND TestStepAttribDefs.Name = 'Sequence A'

Gruss
Friedel

28.07.2006 - 00:57 Uhr

Aus Doku

Hinweise

Mit dieser Eigenschaft können Sie Text im RTF-Format zur Anzeige in das Steuerelement platzieren oder den Text des Steuerelements mit der angegebenen, im Text des Steuerelements definierten RTF-Formatierung extrahieren. Diese Eigenschaft wird üblicherweise verwendet, wenn dem Steuerelement Text im RTF-Format aus einer anderen RTF-Quelle zugewiesen wird, wie Microsoft Word oder Windows WordPad.

//Danke für die Antwort auf meine Frage !!!

27.07.2006 - 20:10 Uhr

Hallo qba,


System.Drawing.Font font = new Font(new FontFamily("Arial"), FontStyle.Regular);
font.GetHeight();

Gruss
Friedel

27.07.2006 - 17:15 Uhr

Hallo TheHonk,

habe von den Tools für Office keine Ahnung, aber ich denke sowas sollte mit RTF funktionieren. Wenn du bspw. eine RichTextBox hast, hat die die Eigenschaft Rtf. Wenn deine Methode dieses verarbeiten kann, hast du vermutlich das, was du haben willst.

//Gibt es die Tools für Office eigentlich umsonst, oder kosten die was ?

Gruss
Friedel

27.07.2006 - 15:25 Uhr

Hallo Lord Hessia,

also dafür brauch ich jetzt erstmal ne Weile, aber vielen Dank schonmal für die Hilfe.
Melde mich später.

Gruss
Friedel

27.07.2006 - 13:52 Uhr

Hallo Lord Hessia,

danke erstmal für deine Antwort.

Du hast recht, ich habe das falsch beschrieben.

Das kommt raus, wenn ich die von dir gepostete (angepasste) query ausführe (Access / Soll aber auf div. DBs laufen)


SELECT TestSteps.Name,TestStepAttribs.Value, TestStepAttribDefs.Name  FROM TestSteps,TestStepAttribs, TestStepAttribDefs WHERE TestStepAttribs.AttribDefID = TestStepAttribDefs.ID  AND TestStepAttribs.TestStepID = TestSteps.ID AND TestStepAttribs.Value = 'CO' AND TestStepAttribDefs.Name = 'Sequence'
UNION
SELECT TestSteps.Name, TestStepAttribs.Value, TestStepAttribDefs.Name FROM TestSteps,TestStepAttribs, TestStepAttribDefs WHERE TestStepAttribs.AttribDefID = TestStepAttribDefs.ID  AND TestStepAttribs.TestStepID = TestSteps.ID AND TestStepAttribs.Value = 'TEST' AND TestStepAttribDefs.Name = 'Sequence A'

Was ich gerne hätte:
Die Werte aus der Spalte TestAttribsDef.Name, sollen je Wert eine Spalte im DataSet darstellen, und die Values entsprechend auf die Spalten verteilt werden. D.h. CO min und CO nom haben nur einer Eintrag in der Spalte Sequence, CO max einen in der Spalte Sequence und einen in der Spalte Sequence A.

TestStep.Name | Sequence | Sequence A

CO max...........| CO...........| Test
CO min............| CO...........|
CO nom...........| CO...........|

Ich hoffe du, ihr versteht mein Problem jetzt besser.

Gibt es dafür eine Möglichkeit ?

Danke

Gruss
Friedel

27.07.2006 - 11:59 Uhr

Hallo Forum,

ich habe ein Problem mit einer Abfrage, mit dem ich einfach nicht weiterkomme. Habe schon Stunden im I-Net gesucht. Da ich aber nicht wirklich weiß wonach, wird das echt langsam nervig.
Vielleicht weiß jemand von euch eine Lösung.

Voraussetzungen:
Ich habe eine Reihe Tabellen, welche miteinander verknüpft sind.

Attribs
ID | Value | AttribDefsID

AttribDefs
ID | Name

Testobject
ID | Name | AttribID | ...

Ein Attribute (Attribs) besteht aus einem Namen und einem Wert. Da ein namentlich bekanntes Attribut mehrere Werte haben kann, gibt es die beiden Tabellen Attribs, AttribDefs.
Ein Attribute gehört zu einem Testobject.

Das Problem:
Ich möchte eine Abfrage haben, welche mir alle Testobjecte zurück gibt, welche das Attribute "Sequence" mit dem Wert "CO", oder welche das Attribute "Sequence A" mit dem Wert "OCO" besitzen.

Wie stelle ich sowas an. Hab mit Subqueries rumgebastelt, aber die führten immer zu dem gleichen Ergebnis. In der Tabelle habe ich eine Spalte Testobject.Name, eine Spalte "Sequence" und eine Spalte "Sequence A". Allerdings sind alle gefüllt. D.H. ein Testobject 'TO1' hat immer beide oder keins.

dazugehörige SQL-Abfrage:


SELECT Jobs.Name AS [JOBSNAME], [SEQUENCE].Value AS [SEQUENCET],  [SEQUENCEA].Value AS [SEQUENCETA]

FROM Jobs, Sessions, TestSteps,
(SELECT * FROM TestStepAttribs, TestStepAttribDefs WHERE (TestStepAttribDefs.Name = "Sequence" AND TestStepAttribs.Value = "CO") AND TestStepAttribs.AttribDefID = TestStepAttribDefs.ID)  [SEQUENCE],
(SELECT * FROM TestStepAttribs, TestStepAttribDefs WHERE (TestStepAttribDefs.Name = "Sequence A" AND TestStepAttribs.Value = "OCO") AND TestStepAttribs.AttribDefID = TestStepAttribDefs.ID) [SEQUENCEA]

WHERE Jobs.ID = Sessions.JobID AND Sessions.ID = TestSteps.SessionID AND ( [SEQUENCE].TestStepID = TestSteps.ID OR  [SEQUENCEA].TestStepID = TestSteps.ID)

Bin für jede Anregung oder jeden Tip dankbar.

Gruss
Friedel

24.07.2006 - 22:33 Uhr

Hallo @all,

die Ursprüngliche Diskussion habe ich natürlich mit Interesse verfolgt, aber daran beteiligen wollte ich mich nicht; aus gegeben Gründen (Verlauf der Diskussion).

Aber zu diesem Thread kann ich nur sagen:

Besser hätte man das Thema nicht beenden können.
Auch von mir großen Respekt.

Gruss
Friedel

24.07.2006 - 20:54 Uhr

Hallo haab,

weiß nicht so genau, ob ich deine Frage richtig verstehe, aber...

zu Frage 1: Meines Wissens nach nicht.

zu Frage 2: Dem PropertyGrid kann jedes beliebige Objekt zugewiesen werden. Per Reflection liest dieses dann alle Properties aus, welche das Objekt besitzt.


propertyGrid1.SelectedObject = irgendeinObjekt;


public class IrgendeinObjekt
{
   private string name;

   public IrgendeinObjekt()
   {
       this.name = "TestName";
       ...
   }

   //Accessoren
   public string Name
   {
       get{return this.name;}
       set{this.name = value;}
   }
}

Im PropertyGrid wird eine Zeile mit dem Namen 'Name' und dem zugehörigen Wert 'TestName' angezeigt.

Mit Attributen lässt sich das PropertyGrid sehr gut einstellen. Dazu musst du mal in der Doku suchen.

Gruss
Friedel

//edit: Fehler korregiert

24.07.2006 - 20:45 Uhr

Hallo starchild,

Oder die Dateien nach Datum sortiert, das würde auch gehen.


private void button1_Click(object sender, EventArgs e)
{
          DirectoryInfo di = new DirectoryInfo(@"c:\test");
          FileSystemInfo[] fileSystemInfos = di.GetFileSystemInfos();
          Array.Sort(fileSystemInfos, new Comparison<FileSystemInfo>(compareFiles));
}

private int compareFiles(FileSystemInfo info1, FileSystemInfo info2)
{
          return info1.CreationTime.CompareTo(info2.CreationTime);
}

Damit sortierst du die Liste deiner Dateien nach dem Datum, an welchem diese erstellt worden sind. Grundsätzlich ist es natürlich auch möglich, die Dateien nach deren Name zu sortieren, allerdings müssten dafür die Namen der LogFiles einheitich (vergleichbar) sein.

Gruss
Friedel

//edit: Fehler korregiert

22.07.2006 - 20:41 Uhr

Hallo Fabian,

es gibt doch das Event ListView.ColumnHeaderClick. Hilft dir das nicht evtl. weiter ?

Gruss
Friedel

22.07.2006 - 20:31 Uhr

Hallo torkel,

vermutlich liegt der Fehler im Anlegen des Datasets, bzw. beim anlegen der Tabelle 'Stoffbreite'. Wenn du der Tabelle Columns zuweist, musst du darauf achten, dass die Column den richtigen Typ zugewiesen bekommt.
Also, an der Stelle wo du die Columns für die Tabelle 'Stoffbreite' anlegst, weist du diesen den entsprechenden Typ zu.

Gruss
Friedel

22.07.2006 - 10:55 Uhr

Hallo nic4x4,


public TestMeth()
{
      List<ListViewItem> items = new List<ListViewItem>();
      items.Sort(new Comparison<ListViewItem>(compareItems));
}

private int compareItems(ListViewItem item1, ListViewItem item2)
{
      return String.Compare(item1.Text, item2.Text);
      //hier wird <0 zurückgegeben, wenn item1.Text < item2.Text
      //0, wenn beide strings gleich
      //>0 wenn item1.Text > item2.Text
}

Gruss
Friedel

21.07.2006 - 14:42 Uhr

Hallo c#_gast,

das realisierst du am besten im ControlAdded - Event des Panels. Sobald ein Button hinzukommt, rechnest du für diesen und alle bereits vorhandenen Buttons die neue Größe aus, und weist diese dem jeweiligen Button zu.
Anlog dazu: ControlRemoved - Event, falls ein Button entfernt wird.

Gruss
Friedel