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
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
Habe mit Copy & Paste alles nochmal neu erstellt und wie gesagt, bei mir legt er direkt mit dem ersten Buchstaben los.
Gruss
Friedel
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
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
Hallo Afrokalypse,
also in der Pro Version ist das unter:
Tools-> Options -> Text Editor -> C# / LineNumbers
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
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
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
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
Hallo vbtricks,
einfach
[assembly: AssemblyFileVersion("1.2.*")]
löschen.
Warum ? Keine Ahnung aber es funzt.
Gruss
Friedel
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
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
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
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
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;
}
...
}
Mit was programmierst du ?
System.Windows.Forms.Form hat die Eigenschaft KeyPreview in 1.0, 1.1, 2.0
In der Form, im Konstruktor nach InitializeComponents() this.KeyPreview = true setzten.
//edit:
Oder im Designer die Form markieren und die Eigenschaft setzen.
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.
Hallo dgroeser,
zu 1
form1.KeyPreview = true;
die 2. Frage verstehe ich nicht. Was meinst du mit "durchblättern" ?
Gruss
Friedel
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
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
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
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
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
Habt recht.
Vielleicht sollte man erst mal denken und dann antworten 8)
Sorry
Gruss
Friedel
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
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
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
Hallo Second Sun,
solche Fragen gab es schon mehrfach.
Versuch mal mit der Suche etwas passendes zu finden.
Gruss
Friedel
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 🙂
Hallo,
also bei mir funzt das ohne Probleme.
Du musst für jedes Control ein eigenes ToolTip-Objekt anlegen.
Gruss
Friedel
// 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
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
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 !!!
Hallo qba,
System.Drawing.Font font = new Font(new FontFamily("Arial"), FontStyle.Regular);
font.GetHeight();
Gruss
Friedel
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
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
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.
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
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
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
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
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
Hallo Fabian,
es gibt doch das Event ListView.ColumnHeaderClick. Hilft dir das nicht evtl. weiter ?
Gruss
Friedel
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
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
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