Diese Namensliste importiere ich in ein DataTable:
#region Init Table
var _dtFiles = new DataTable();
_dtFiles.TableName = "Files";
var files = new DataColumn { ColumnName = "Value", DataType = typeof(Int32) };
_dtFiles.Columns.Add(files);
_dtFiles.PrimaryKey = new[] { files };
#endregion
var objDialog = new FolderBrowserDialog
{
Description = @"Folder",
SelectedPath = @"D:\Temp"
};
var objResult = objDialog.ShowDialog(this);
if (objResult != DialogResult.OK)
{
return;
}
_dtFiles.Clear();
var folder = objDialog.SelectedPath;
var dinfo = new DirectoryInfo(folder);
var finfo = dinfo.GetFiles("*.txt");
foreach (var file in finfo)
{
var row = _dtFiles.NewRow();
var hour = file.Name.Substring(9, 2).Replace(".", "");
if (hour.Length < 2)
{
hour = string.Concat("0", hour);
}
row[0] = Convert.ToInt32(string.Concat(file.Name.Substring(4, 4), file.Name.Substring(2, 2), file.Name.Substring(0, 2), hour));
_dtFiles.Rows.Add(row);
}
const string sortExpression = "Value";
_dtFiles.DefaultView.Sort = sortExpression;
dgvFiles.DataSource = _dtFiles;
Diese wird auch ordentlich dargestellt. Also den 26.06.2017 vor dem 27.06.2017 usw.
Jetzt möchte ich diese DataTable zeilenweise durchlaufen und je den Inhalt der gefundenen Datei in ein weiteres DataTable einlesen:
foreach (DataRow dr in _dtFiles.Rows)
{
var date = string.Concat(dr[0].ToString().Substring(6, 2), dr[0].ToString().Substring(4, 2), dr[0].ToString().Substring(0, 4));
var hour = Convert.ToInt32(dr[0].ToString().Replace(date, ""));
var file = Path.Combine(teFolder.Text, string.Concat(date, "_", hour, ".txt"));
if (File.Exists(file))
{
using (var sr = new StreamReader(file, Encoding.Default))
{
while (!sr.EndOfStream)
{
var line = sr.ReadLine();
if (!line.Contains(@"TP"))
{
line = line.Replace(@"\r\n", Environment.NewLine);
}
var row = _dtLines.NewRow();
row[0] = line;
_dtLines.Rows.Add(line.Replace("Multicast:", "").Replace("xxxxxxxxxxxx", ""));
}
}
}
dgvLines.DataSource = _dtLines;
}
Mein Problem ist nun dass im Ordner die erste Datei vom Namen her die 01012017... ist, nicht die 26062017... und das 2. Skript einfach nicht bei der 26062017... anfängt
ich habe da ein weiteres Anliegen und hoffe ihr könnt mir den richtigen Denkanstoß geben.
Auf einer Webform habe ich einen Hyperlink welcher auf hinterlegte Dateien verweist. Diese haben z.B. folgenden Namen: xyz123.pdf sollen jedoch z.B. als Test.pdf gespeichert werden.
Wie stelle ich das an dass der Benutzer welcher den Hyperlink betätigt das xyz123.pdf nicht zu sehen bekommt?
ich arbeite aktuell an meinem ersten Webprojekt und bin aktuell an einem Punkt angekommen wo ich nicht weiter komme und eure Hilfe erbitte.
Im folgenden habe ich das ASPxGrid und die Datenfüllung abgebildet. Das alles funktioniert auch sehr gut.
Was mir fehlt: Wenn ein Benutzer eine Zeile im Grid anklickt (oder per Pfeil-Up/Down) wählt oder ändert, so würde ich gerne den Wert z.B. des Feldes description auslesen und in als ASPxLabel Wert anzeigen. Ich komme da einfach nicht weiter, also vielen Dank schon einmal für eure Mühen.
SELECT [position]
,CONVERT(VARCHAR(8), GETDATE(), 112)
,[Archiv]
FROM [datenbankname].[dbo].[tabelle]
Das liest sich aber aus den bisherigen Antworten ...
Versuch mal:
SELECT CONVERT(VARCHAR(8), GETDATE(), 112)
Das bringt nur das Datum, aber ich verstehe nicht warum du das aktuelle SQL Datum unter C# abfragst - das kannst du doch auch, schneller, unter C# mittels DateTime.Now :-)
ich habe da mal eine Frage nach der Performance bzgl. Using nutzen oder nicht.
Hat das mal jemand getestet was besser ist bzgl. Geschwindigkeit und Speicherauslastung?
zum Beispiel:
namespace Test
{
public partial class frmMemo : System.Windows.Forms.Form
{
public frmMemo(string table, string memo)
{
InitializeComponent();
Text = string.Concat(Localize.TranslateToString(Name, table), " - ", Localize.TranslateToString(Name, "Memo Preview"));
teMemo.MhtText = memo;
}
}
}
vs.
using System.Windows.Forms;
namespace Test
{
public partial class frmMemo : Form
{
public frmMemo(string table, string memo)
{
InitializeComponent();
Text = string.Concat(Localize.TranslateToString(Name, table), " - ", Localize.TranslateToString(Name, "Memo Preview"));
teMemo.MhtText = memo;
}
}
}
ich habe ein komisches Verhalten bei einer Abfrage
SELECT COUNT(*) FROM table1; = 38000 Datensätze
SELECT * FROM table1; = 38000 Datensätze
SELECT COUNT(*) FROM table2; = 131461 Datensätze
SELECT * FROM table2; = 131461 Datensätze
Jetzt der Fehler:
SELECT COUNT(*) FROM table1 a
LEFT OUTER JOIN table2 b ON b.ID = a.ID; = 38819 Datensätze
Soweit ich das gelernt habe wird alles aus der linken Tabelle angezeigt und falls in der rechten etwas vorhanden ist, wird das angezeigt.
Kann mir da jemand auf die Sprünge helfen? Insgesamt sind es 5 Tabellen die aufeinander verweisen. Wichtig ist dass nur die Anzahl der ersten Tabelle stimmt.
[gelöst] Manchmal sieht man den Wald vor Bäumen nicht :-)
Form f = new Form();
Control c = new UCtrl();
c.Dock = DockStyle.Fill;
f.Controls.Add(c);
f.MdiParent = this.MdiParent;
f.Show();
Hallo zusammen,
ich habe folgendes Problem:
Bei einer bestehenden Applikation besteht die Navigation aus einer Windows 8 UI (Tiles) Struktur.
Jetzt ist es gewünscht dass zusätzlich die Möglichkeit besteht eine alternative Darstellung bei Applikation Start zu wählen. Gewünscht ist hier MDI.
Alle bisherigen Oberflächen liegen auf UserControls und ich möchte diese ungerne duplizieren und die Duplikate zu Forms machen da ich dann doppelten Wartungsaufwand im Fall von Änderungen habe.
Kann mir jemand einen Tipp geben wie ich aus einem MDI Child Form ein UserControl als MDI Child aufrufen kann?
Form (funktioniert):
var frm = new Frm { MdiParent = this.MdiParent };
frm.Show();
UserControl (funktioniert nicht):
var uCtrl = new UCtrl { MdiParent = this.MdiParent };
uCtrl.Show();
Ich habe eine Tabelle "Personen" welche neben den Spalten Nummer, Name noch einige andere Spalten hat.
Im Laufe der Entwicklung kommen die Benutzer jedoch immer wieder mit z.B. "Wir brauchen da noch eine Spalte Augenfarbe, Haarfarbe, usw.
Dadurch wurde die Tabelle immer größer und ich musste bei jedem Einfall a) an die Tabelle und b) an einige UserControls dran um diese zu erweitern.
Da diese mit jedem Mal unübersichtlicher wurden und die neuen Spalten (Felder) meist nur von wenigen Personen (Einträgen) gebraucht wurden habe ich mir die neue Struktur ausgedacht:
Neue Spalten werden nicht mehr in der Datenbank als feste Spalte hinterlegt sondern in einer Tabelle "Kategorien" als Datensatz.
Somit kann einer Person, sofern diese überhaupt die Farbe seiner Augen angegeben hat (Beispiel) der Datensatz Augenfarbe zugeordnet werden und der Wert dazu auch.
Das passiert im Bild (Hintergrund)
Es kann nun also sein dass 5 Personen den Datensatz "Augenfarbe" zugeordnet haben und je mit Werten (blau, grün, usw.) gefüllt haben.
In einem weiteren UserControl möchte ich nun nach Personen z.B. anhand der Augenfarbe suchen. Da diese Suchkriterien in Wirklichkeit ja nur noch Datensätze inkl. Verknüpfung an die Personen sind, kann ich keine festen Controls bei der Suche nehmen.
Aus diesem Grund fülle ich ein DataTable mit den Bezeichnungen aller von Personen verwendeten Kategorien und möchte je Bezeichnung ein DevExpress-LookUpEdit angezeigt bekommen. Zusätzlich möchte ich eine Füllung der LookUpEdit Controls mit den jeweiligen Werten (z.B. Augenfarbe: blau, grün, usw.)
Auf dem Bild (Vordergrund) sieht man schon was passiert (die Controls werden zugefügt - nur die Füllung fehlt)
Ich hoffe das ist nun "nicht" technisch genug und ich habe es deutlich beschrieben
ich fülle aus einer SQL Tabelle eine DataTable welche ich dann mittels for (Int32 i ....) durchlaufe und dynamisch LookUpEdit's auf einem TabControl erzeuge und positioniere.
Das funktioniert mit dem folgenden Quellcode ganz gut:
var _cat_type0 = DataAccess.s_categories(true, "a.cat_type = 0", null);
for (var i = 0; i < _cat_type0.Rows.Count; i++)
{
var _te_f = new LookUpEdit();
_te_f.EditValueChanged += new System.EventHandler(lookupedit_Changed);
_te_f.Location = new Point(120, i * 30 + 40);
_te_f.Size = new Size(200, 20);
xscScrollSearch2.Controls.Add(_te_f);
var _te_t = new LookUpEdit();
_te_t.Location = new Point(330, i * 30 + 40);
_te_t.Size = new Size(200, 20);
_te_t.Properties.DataSource = null;
xscScrollSearch2.Controls.Add(_te_t);
}
Somit werden für jeden Eintrag im DataTable 2 LookUpEdit's generiert (von/bis)
Mein Problem ist nun dass ich jedem LookUpEdit auch Werte zuordnen möchte und diese sich je Durchlauf unterscheiden müssen.
Irgendwo stehe ich da auf dem Schlauch und hoffe ihr könnt mir weiterhelfen
das läuft dann eine ganze Zeit - je nach Dateigröße und ich habe die "entpackte" Datei germany.osm im gleichen Ordner liegen.
Unter C# habe ich mir nun einen kleinen Button zur Ordnerauswahl + Auflistung aller Dateien im gewählten Ordner in ein DataTable gebastelt. Das ganze dann noch schön in ein DataGridView und die Dateigröße vorher und den Zieldateinamen ermittelt - Schön siehts aus ...
var dlg = new FolderBrowserDialog();
if (dlg.ShowDialog() == DialogResult.OK)
{
teOrdnerwahl.Text = dlg.SelectedPath;
Fuellen();
btnStart.Enabled = true;
}
DirectoryInfo ParentDirectory = new DirectoryInfo(teOrdnerwahl.Text);
DataColumn col1 = dt.Columns.Add("Quelldatei", typeof(String));
DataColumn col2 = dt.Columns.Add("Quelldatei in byte", typeof(Int64));
DataColumn col3 = dt.Columns.Add("Zieldatei", typeof(String));
DataColumn col4 = dt.Columns.Add("Zieldatei in byte", typeof(Int64));
foreach (FileInfo f in ParentDirectory.GetFiles())
{
dt.Rows.Add(String.Format(@"{0}\{1}", teOrdnerwahl.Text, f.Name), f.Length,
String.Format(@"{0}\{1}", teOrdnerwahl.Text, f.Name.Substring(0, f.Name.Length - 4).Replace("-latest", "")));
}
dgv.DataSource = dt;
dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
Jetzt zu meinem Problem:
Ein Klick auf den Button Start soll das DataTable durchlaufen und jede Datei automatisch "entpacken" so wie ich es manuell gemacht habe. Der folgende Quelltext funktioniert leider nicht, bringt aber auch keine Fehlermeldung (Wildes Blinken verschiedener cmd-Fenster durch auf- und zuklappen - das wars)
in aktuellen Programmen von meiner Umgebung existiert die Möglichkeit sich über Mehrfachselektierung in Grids abhängige Daten in einem anderen Grid anzeigen zu lassen.
Hierfür nutze ich aktuell folgenden Code:
var exp = "app";
var where = new StringBuilder();
if (gvData.SelectedRowsCount != 0)
{
where.AppendFormat("{0}l_guid IN (", exp);
Parallel.ForEach(gvData.GetSelectedRows(), row => @where.AppendFormat("'{0}', ", GuidHelper.VerifyGuid(gvData.GetRowCellValue(row, gvData.Columns[String.Format("{0}_guid", exp)]))));
where.Remove(where.Length - 2, 2);
where.Append(")");
Hierbei wird ein String zusammengesetzt welchen ich als Parameter an MSSQL übergebe was auch sehr gut funktioniert.
Leider kommt es ab einer bestimmten Länge von gewählten Datensätzen zu einem Fehler da der erstellte String einfach zu lang wird.
Jetzt habe ich den Ansatz stattdessen ein DataTable mit den Werten zu generieren und dieses direkt an den SQL Server (eine PROCEDURE) zu übergeben.
Also folgende PROCEDURE zu erstellen:
CREATE PROCEDURE [dbo].[appl_log]
AS
BEGIN
DECLARE @app_table TABLE
(
g UNIQUEIDENTIFIER NOT NULL
)
SELECT * FROM [appl_log] WHERE appl_guid IN (SELECT g FROM @app_table)
END
Folgende Fragen habe ich nun:
- Wie rufe ich die PROCEDURE von C# auf (Rückgabewert DataTable) ?
- Ist meine SELECT Anweisung richtig ?
ich stehe aktuell vor einem Problem bei dem ich echt nicht weiterkomme.
Ich fülle XtraGrids über XPInstantFeedbackSource (DevExpress) - das funktioniert sehr gut und vor allem extrem schnell da ja dynamisch nachgeladen wird und die Daten sofort zur Verfügung stehen, egal wieviele es sind (zumindest erscheint es dem Benutzer so).
Innerhalb des XtraGrids gibt es unten einen Navigator welcher den gewählten Datensatz und die maximale Anzahl Datensätze des Grids anzeigt.
Eben jenen maximalen Wert benötige ich um in Abhängigkeit Buttons ein- bzw. auszublenden. DataRowCount bringt mich nicht weiter da XPInstantFeedbackSource u.U. noch nachläd und den Wert direkt zu Beginn noch gar nicht hat.
Von daher wüsste ich nur den Weg über den Navigator - der hat seinen Wert ja sofort zu Beginn. Weiß jemand wie ich den auslesen kann - die Hilfe bringt mich nicht weiter ?
ich habe da ein Problem bei welchem ich nicht einmal weiss wie ich anfangen soll :-(
Folgendes ist gewünscht:
ich habe eine SQL Tabelle welche unterschiedliche Spalten beinhaltet. 3 dieser Spalten sollen auf Etikettenbögen gedruckt werden.
Diese 3 Spalten sollen in einem Grid angezeigt werden - soweit kein Problem...
Rechts neben dem Grid soll eine Vorschau einer Etikettenvorlage (3 Spalten, 10 Zeilen) angezeigt werden und die Daten aus dem Grid sollen via Maus Drag'n Drop in die jeweiligen Felder geschoben werden.
Hintergrund hierbei ist dass es Etikettenbögen gibt welche nur teilweise benutzt wurden (also fehlen u.U. auch mal mittig bedruckbare Bereiche). Diese sollen weiter verwendet werden können.
ich habe die Lösung gefunden und poste diese hier für jeden welcher sich dafür interessiert
Innerhalb des letzten Quellcodesnippets folgende Anpassungen machen:
public static void ChangeGridViewLayout (ref GridView gridV, String form)
{
foreach (GridColumn col in gridV.Columns)
{
if (col.ColumnType.FullName == "System.UInt64")
{
var column = new RepositoryItemCheckEdit { NullText = "", ValueGrayed = "-" };
col.ColumnEdit = column;
// UInt64 steht hier für das MySQL Pendant bit(1)
column.ValueChecked = Convert.ChangeType(1, typeof(UInt64));
column.ValueUnchecked = Convert.ChangeType(0, typeof(UInt64));
}
}
}
Ich habe etliche Forms welche sich je eines XtraGridViews bedienen. Diese werden über DataSets wie folgt befüllt:
public static DataSet GetData()
{
var sql = new StringBuilder();
sql.Append("SELECT * FROM tabelle ORDER BY feld; ");
var _params = new ParamCollection();
var q = new MySqlQuery(sql.ToString(), _params, false);
return (DataSet)q.GetMySqlQueryResult();
}
Nach Aufruf und Füllung innerhalb der Form über:
Grid.DataSource = SqlData.GetData().Tables[0];
durchlaufe ich mit:
ChangeGridViewLayout(Name, ref GridView);
das jeweilige XtraGridView um z.B. die Spaltennamen zu übersetzen.
Jetzt möchte ich im ChangeGridViewLayout auch feststellen ob ein Feld SQL-Bit (Boolean) ist und dieses entsprechend als CheckEdit Feld anzeigen zu lassen.
public static void ChangeGridViewLayout (ref GridView gridV, String form)
{
foreach (GridColumn col in gridV.Columns)
{
if (col.ColumnType.FullName == "System.UInt64")
{
var column = new RepositoryItemCheckEdit { NullText = "", ValueChecked = "true", ValueUnchecked = "false", ValueGrayed = "-" };
col.ColumnEdit = column;
}
}
}
Das funktioniert auch in der Form dass die Spalten nun als CheckEdit Felder angezeigt werden, jedoch fehlen die Werte (true oder false)
Kann mir einer sagen warum der die Werte nicht übernimmt ?
ich habe auf einer WinForm eine CheckedListBox mit etlichen Einträgen (reicht locker um die Scrollleisten zu sehen). Diese CheckedListBox soll Daten mit einem Mausklick "aktivieren" - Funktioniert auch einwandfrei.
Wie bekomme ich es nun hin dass ich nicht erst einen Datensatz markiere und wieder "demarkiere" um mittels Mausrad scrollen zu können.
Das geht irgendwie nur wenn das CheckedListBox-Control den Focus hat - nur dann ist halt schon eine Datensatz markiert :-(