Laden...
M
mrennen myCSharp.de - Member
Softwareentwickler Duisburg Dabei seit 23.09.2008 166 Beiträge
Benutzerbeschreibung

Forenbeiträge von mrennen Ingesamt 166 Beiträge

17.07.2017 - 12:23 Uhr

Gelöst, trotzdem Danke an alle die sich bemüht haben

17.07.2017 - 12:03 Uhr

Hallo zusammen,

ich sehe aktuell den Wald vor Bäumen nicht und erhoffe mir einen Denkanstoß von euch.

In einem Ordner auf der HDD habe ich haufenweise Log-Dateien welche folgenderweise benannt sind:

25062017_0.txt, 25062017_1.txt, usw. (Tag, Monat, Jahr, _, Stunde)

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 hoffe ihr könnt helfen - Danke

24.01.2017 - 12:11 Uhr

Das war genau der richtige Hinweis. Thread ist somit erledigt 😃

24.01.2017 - 09:54 Uhr

Hallo zusammen,

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?

Gruß und Danke

Michael

13.01.2017 - 13:59 Uhr

Hallo zusammen,

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.

frmWeb.aspx:

<dx:ASPxGridView ID="grv" runat="server" Theme="DevEx" Width="270px" OnDataBinding="grv_DataBinding" KeyboardSupport="True">
<SettingsPager NumericButtonCount="4" PageSize="18" AlwaysShowPager="True">
<Summary AllPagesText="" Position="Inside" Text="" />
</SettingsPager>
<Settings HorizontalScrollBarMode="Visible" GridLines="Horizontal" VerticalScrollBarMode="Visible" VerticalScrollableHeight="420" />
<SettingsBehavior AllowFocusedRow="True" />
<SettingsDataSecurity AllowDelete="False" AllowEdit="False" AllowInsert="False" />
<SettingsSearchPanel Visible="True" />
<Columns>
<dx:GridViewDataTextColumn FieldName="key" ReadOnly="True" VisibleIndex="1"><EditFormSettings Visible="False" /></dx:GridViewDataTextColumn>
<dx:GridViewDataTextColumn FieldName="description" VisibleIndex="2" Width="250"></dx:GridViewDataTextColumn>
</Columns>
</dx:ASPxGridView>

frmWeb.aspx.cs:

protected void grv_DataBinding(object sender, EventArgs e)
{
    var dt = Session["Files"] as DataTable;
    if (dt == null)
    {
        for (var i = 0; i < 100000; i++)
        {
            dt.Rows.Add(i, "row" + i);
        }

        Session["Files"] = dt;
    }

    grv.KeyFieldName = @"fil_key";

    grv.DataSource = dt;
}
25.07.2016 - 20:18 Uhr

Hallo zusammen,

ich habe da ein Problem mit dem Einlesen einer XML in ein DataTable. Hier ein Beispiel der XML Datei:


<Cobalt>
    <Asset AssetType="APPAREL" InternalID="1">
        <type_metadata>
            <FIELD name="name">1602102000133773.mpg</FIELD>
            <FIELD name="date">2016-08-08</FIELD>
        </type_metadata>
        <custom_metadata>
            <FIELD name="date_in">2016-02-10 20:00:00</FIELD>
            <FIELD name="date_out">2016-02-10 20:10:00</FIELD>
            <FIELD name="product_number">123456</FIELD>
            <FIELD name="comment"/>
            <FIELD name="product_description">Test 1</FIELD>
        </custom_metadata>
    </Asset>
    <Asset AssetType="APPAREL" InternalID="2">
        <type_metadata>
            <FIELD name="name">1602102000133781.mpg</FIELD>
            <FIELD name="date">2016-08-08</FIELD>
        </type_metadata>
        <custom_metadata>
            <FIELD name="date_in">2016-02-10 20:10:01</FIELD>
            <FIELD name="date_out">2016-02-10 20:20:00</FIELD>
            <FIELD name="product_number">123457</FIELD>
            <FIELD name="comment"/>
            <FIELD name="product_description">Test 2</FIELD>
        </custom_metadata>
    </Asset>
    <Asset AssetType="APPAREL" InternalID="3">
        <type_metadata>
            <FIELD name="name">1602102000133800.mpg</FIELD>
            <FIELD name="date">2016-08-08</FIELD>
        </type_metadata>
        <custom_metadata>
            <FIELD name="date_in">2016-02-10 20:20:01</FIELD>
            <FIELD name="date_out">2016-02-10 20:30:00</FIELD>
            <FIELD name="product_number">123458</FIELD>
            <FIELD name="comment"/>
            <FIELD name="product_description">Test 3</FIELD>
        </custom_metadata>
    </Asset>
</Cobalt>

Es sind 3 Zeilen welche zu verarbeiten sind, z.B. FIELD name="date_in" ist die Bezeichnung, während 2016-02-10 20:00:00 der entsprechende Wert ist.

Kann mir bitte jemand einen Denkanstoß geben?

Danke und Gruß

Michael

03.10.2015 - 01:43 Uhr
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 😃

04.08.2015 - 11:56 Uhr

Ich könnte mir vorstellen dass z.B.

using System;

die komplette dll in den Speicher läd auch wenn ich nur Teile brauche.

Das ist eigentlich der ganze Sinn meiner Frage 😃

04.08.2015 - 11:41 Uhr

Hallo zusammen,

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;
        }
    }
}

07.06.2015 - 02:31 Uhr
textBox.Text = "NamedesTextes"; 

Das reicht völlig. Das += hängt beim nächsten Drücken des Buttons den Text an (Wie

 textBox.Text = TextBox.Text + "NamedesTextes";

)

Also 1x klicken ergibt dann

NamedesTextes

2x klicken ergibt dann

NamedesTextesNamedesTextes

usw.

13.01.2015 - 18:26 Uhr

verwendetes Datenbanksystem: <Oracle>

Hallo zusammen

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.

10.09.2014 - 12:04 Uhr

[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();

Danke

10.08.2014 - 20:13 Uhr

ich habe es gefunden - danke für die Hilfe

man sollte am Wochenende ruhen, nicht arbeiten 😃

10.08.2014 - 20:03 Uhr

stimmt vor den Kopf hau

Wie kann ich das unterbinden dass die lokale DB jedes Mal beim Ausführen der Applikation neu erstellt wird ?

Danke

10.08.2014 - 19:27 Uhr

verwendetes Datenbanksystem: SQLCE

Hallo zusammen,

ich habe ein neues kleines Projekt begonnen und möchte gerne SQLCE als Datenbank verwenden.

Offenbar wird auch ordentlich gespeichert da ich nach dem Speichern eine Aktualisierung mache und dann sind die eingegebenen Daten da.

Nach Beenden und Neustart der Anwendung sind die Daten aber weg und ich finde den Grund einfach nicht 😦

So als ob ein Commit fehlen würde - kann das sein?

Ich habe die Anwendung online gestellt (Visual Studio 2012) und hoffe auf Hilfe.

http://www.mapmessenger.net/app.zip

Danke für eure Mühe

30.07.2014 - 11:07 Uhr

OK dann versuche ich es mal 😃

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

Danke

30.07.2014 - 10:13 Uhr

Ich habe eine SQL Tabelle Personen wo den Usern aktuell permanent einfällt neue Spalten wären notwendig (Augenfarbe, Haarfarbe, Länge, usw.)

Fast täglich war das der Fall so dass ich eine Tabelle Kategorien eingeführt habe.

Dort werden nun die von den Usern geforderten "Spalten" als Datensatz gefüllt und angegeben ob String, Numeric oder Boolean Typ zugeordnet wird.

So kann pro Person je die verwendeten Kategorien zugeordnet werden (immer nur ein paar)

Diese Kategorien sollen nun in eine Suchmaske als LookUpEdit und mit den gespeicherten Daten gefüllt werden (Augenfarbe: blau, braun, grün, usw.)

30.07.2014 - 10:02 Uhr

Hallo zusammen,

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

Danke

11.01.2014 - 09:38 Uhr

Hallo zusammen,

ich habe eine Denkblockade und hoffe jemand kann mir helfen diese zu lösen ...

Folgendes Problem:

Ich habe 2 DataTable und würde gerne die Einträge von a nach b und umgekehrt verschieben (via Button).

Das kopieren der Einträge in die jeweilige Ziel-DataTable funktioniert, jedoch bekomme ich beim Löschen immer folgende Fehlermeldung:

Die angegebene DataRow befindet sich nicht in der aktuellen DataRowCollection.

Hier also einmal der Quellcode und ein Screenshot vom entsprechenden Programmbereich:


private void btnAddFiles_Click(Object sender, EventArgs e)
        {
            DataTable dt = GridHelper.GetTableOfSelectedRows(gridView);
            foreach (DataRow dr in dt.Rows)
            {
                var row = _rFiles.NewRow();
                row.ItemArray = dr.ItemArray;
                _rFiles.Rows.Add(row);

                _lFiles.Rows.Remove(row); // Hier kommt die Exception
            }
        }

Ich hoffe jemand hat einen Hinweis für mich

Danke

27.09.2013 - 15:03 Uhr

ich habe mir eine MessageBox anzeigen lassen was der da versucht (siehe Dateianhang)

Ich bin den Pfad auch mal durchgegangen - die Dateien liegen wirklich an dem jeweiligen Ort 😦

27.09.2013 - 14:20 Uhr

Hallo zusammen,

da ich es leid bin immer von Hand osm.pbf Dateien über die cmd zu entpacken habe ich mir ein kleines Programm geschrieben bei welchem ich nun hänge.

Normalerweise starte ich eine cmd und tippe z.B. ein:

c:\osm\osmconvert.exe germany-latest.osm.pbf > germany.osm <ENTER>

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)


        private void btnStart_Click(object sender, EventArgs e)
        {
            String programm = String.Format(@"{0}\{1}", teOrdnerwahl.Text ,"osmconvert.exe");
            String parameter = String.Empty;

            for (Int32 i = 0; i < dgv.RowCount; i++)
            {
                dgv.Rows[i].DefaultCellStyle.BackColor = Color.Gray;

                parameter = String.Format(@"{0} >{1}", dt.Rows[i][0], dt.Rows[i][2]);

                Process.Start("cmd.exe", String.Format(@"/c {0} {1}", programm, parameter).Replace("\\", @"\"));
            }
        }

Was mache ich hier falsch???

08.03.2013 - 09:40 Uhr

verwendetes Datenbanksystem: MSSQL 2008 R2

Hallo zusammen,

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 ?
15.01.2013 - 14:42 Uhr

verwendetes Datenbanksystem: MSSQL

Hallo zusammen,

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 ?

Danke und Gruß

Michael

23.09.2012 - 15:43 Uhr

Hallo zusammen,

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.

Hat jemand so etwas schon einmal gemacht ?

05.09.2012 - 11:22 Uhr

Hallo,

folgendes sollte funktionieren:

dataGrid.Columns[0].Visibility=Visibility.Hidden;

Gruß

Michael

28.08.2012 - 14:40 Uhr

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));
                }
            }
        }

28.08.2012 - 13:45 Uhr

Teilweise gelöst, jedoch fehlt noch etwas 😦

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 ?

Danke und Gruß

Michael

28.08.2012 - 10:22 Uhr

Ich habe es nun anders gelöst und die User sind damit zufrieden 😃

Im MouseEnter-Event mache ich ein Object.Focus();

Mit dem Hinweis: Es wird eh nur gescrollt wenn ein Wert "weiter unten" gewählt werden soll ...

Danke für eure Mühen

Michael

27.08.2012 - 17:56 Uhr

Hallo zusammen,

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 😦

Hat jemand eine Idee ?

Gruß und Thx

Michael

24.08.2012 - 23:09 Uhr

Erledigt - DANKE @gfoidl

Ich habe weiter experimentiert

mit importReader.Close(); funktioniert es nun 😃

Danke und Gruß aus Duisburg

Michael

24.08.2012 - 22:57 Uhr

Schon einmal danke

Beim Versuch den XmlReader zu disposen bekomme ich:

Fehlermeldung:
System.Xml.XmlReader.Dispose(bool)" ist aufgrund der Sicherheitsebene nicht möglich.

Ich bin Admin auf der Kiste hier und es gibt keine Domain oder so...

Versucht habe ich es über: importReader.Dispose();

24.08.2012 - 21:46 Uhr

Hallo zusammen,

ich baue mir aktuell ein kleines Hilfsprogramm welches zukünftig Logdateien per Timer zippen soll.

Dabei sollen beliebig viele Quell- und Zielpfade möglich sein, gespeichert (damit nicht jedes Mal neu eingestellt werden soll) über eine XML Datei.

Das funktioniert auch soweit bis ich z.B. bei Vorhandensein einer xml-Datei erneut auf Speichern klicke.

Dann kommt:> Fehlermeldung:

Der Prozess kann nicht auf die Datei xxxxx zugreifen, da sie von einem anderen Prozess verwendet wird.

Ich verstehe jedoch nicht wo - da ich das DataGridView zwar zu Beginn des Programmes über die xml-Datei fülle, die entsprechende Methode jedoch schon lange wieder verlassen habe...

Evtl. kann mir ja einer einen "Gedanken-Tritt" geben:

Gruß und Danke

Michael


using System.Collections.Generic;
using ICSharpCode.SharpZipLib.Checksums;
using ICSharpCode.SharpZipLib.Zip;
using System;
using System.Data;
using System.IO;
using System.Linq;
using System.Windows.Forms;
using System.Xml;

namespace ZipFiles_and_Folders
{
    public partial class frmMain : Form
    {
        DataTable _dt = new DataTable();

        public frmMain()
        {
            InitializeComponent();

            _dt.Columns.Add("Art");
            _dt.Columns.Add("Quelle");
            _dt.Columns.Add("Ziel");
            _dt.Columns.Add("Timer");
            _dt.Columns.Add("Kompression");

            Import();
        }

        private void Import()
        {
            String file = String.Format("{0}\\{1}", Application.StartupPath, "data.xml");
            if (File.Exists(file))
            {
                XmlReader importReader;
                importReader = XmlReader.Create(file, new XmlReaderSettings());
                DataSet importDataSet = new DataSet();
                importDataSet.ReadXml(importReader);
                _dt = importDataSet.Tables[0];
                dgv.DataSource = _dt;
            }
        }

        private void BtnSourceFolderClick(object sender, EventArgs e)
        {
            var source = new FolderBrowserDialog();
            if (source.ShowDialog() == DialogResult.OK)
            {
                teSourceFolder.Text = source.SelectedPath;
            }

            if (teSourceFolder.Text == String.Empty || !Directory.Exists(teSourceFolder.Text))
            {
                MessageBox.Show(@"Quell Ordner ist nicht gefüllt oder nicht existent", @"Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error);
                teSourceFolder.Focus();
                return;
            }
        }

        private void BtnDestinationFolderClick(object sender, EventArgs e)
        {
            var destination = new FolderBrowserDialog();
            if (destination.ShowDialog() == DialogResult.OK)
            {
                teDestinationFolder.Text = destination.SelectedPath;
            }

            if (teDestinationFolder.Text == String.Empty || !Directory.Exists(teDestinationFolder.Text))
            {
                MessageBox.Show(@"Ziel Ordner ist nicht gefüllt oder nicht existent", @"Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error);
                teDestinationFolder.Focus();
                return;
            }
        }

        private void BtnInsertFolderClick(object sender, EventArgs e)
        {
            if (!Directory.Exists(teSourceFolder.Text) || !Directory.Exists(teDestinationFolder.Text))
            {
                if (!Directory.Exists(teSourceFolder.Text))
                {
                    teSourceFolder.Focus();
                }
                else
                {
                    teDestinationFolder.Focus();
                }

                return;
            }

            Boolean error = false;
            foreach (DataGridViewRow row in dgv.Rows)
            {
                if (row.Cells[0].Value.ToString() == "Ordner" && row.Cells[1].Value.ToString() == teSourceFolder.Text && row.Cells[2].Value.ToString() == teDestinationFolder.Text)
                {
                    error = true;
                }
            }

            if (!error)
            {
                var dr = _dt.NewRow();
                dr["Art"] = "Ordner";
                dr["Quelle"] = teSourceFolder.Text;
                dr["Ziel"] = teDestinationFolder.Text;
                dr["Timer"] = teTimerFolder.Text;
                dr["Kompression"] = teMaxZipFolder.Value;

                _dt.Rows.Add(dr);
                dgv.DataSource = _dt;
            }
        }

        private void BtnSourceFileClick(object sender, EventArgs e)
        {
            var source = new OpenFileDialog();
            if (source.ShowDialog() == DialogResult.OK)
            {
                teSourceFile.Text = source.FileName;
            }

            if (teSourceFile.Text == String.Empty || !File.Exists(teSourceFile.Text))
            {
                MessageBox.Show(@"Quell Datei ist nicht gefüllt oder nicht existent", @"Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error);
                teSourceFile.Focus();
                return;
            }
        }

        private void BtnDestinationFileClick(object sender, EventArgs e)
        {
            var destination = new FolderBrowserDialog();
            if (destination.ShowDialog() == DialogResult.OK)
            {
                teDestinationFile.Text = destination.SelectedPath;
            }

            if (teDestinationFile.Text == String.Empty || !Directory.Exists(teDestinationFile.Text))
            {
                MessageBox.Show(@"Ziel Ordner ist nicht gefüllt oder nicht existent", @"Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error);
                teDestinationFile.Focus();
                return;
            }
        }

        private void BtnInsertFileClick(object sender, EventArgs e)
        {
            if (!File.Exists(teSourceFile.Text) || !Directory.Exists(teDestinationFile.Text))
            {
                if (!File.Exists(teSourceFile.Text))
                {
                    teSourceFile.Focus();
                }
                else
                {
                    teDestinationFile.Focus();
                }

                return;
            }

            Boolean error = false;
            foreach (DataGridViewRow row in dgv.Rows)
            {
                if (row.Cells[0].Value.ToString() == "Datei" && row.Cells[1].Value.ToString() == teSourceFile.Text && row.Cells[2].Value.ToString() == teDestinationFile.Text)
                {
                    error = true;
                }
            }

            if (!error)
            {
                var dr = _dt.NewRow();
                dr["Art"] = "Datei";
                dr["Quelle"] = teSourceFile.Text;
                dr["Ziel"] = teDestinationFile.Text;
                dr["Timer"] = teTimerFile.Text;
                dr["Kompression"] = teMaxZipFile.Value;

                _dt.Rows.Add(dr);
                dgv.DataSource = _dt;
            }
        }

        private void BtnStartClick(object sender, EventArgs e)
        {
            if (dgv.Rows.Count != 0)
            {
                foreach (DataRow row in _dt.Rows)
                {
                    if (row[0].ToString() == "Ordner")
                    {

                    }
                    else if (row[0].ToString() == "Datei")
                    {

                    }
                }
            }
            else
            {
                MessageBox.Show(@"Es wurden keine Daten angegeben", @"Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void btnSave_Click(object sender, EventArgs e)
        {
            if (dgv.Rows.Count != 0)
            {
                DataSet exportDataSet = new DataSet();
                exportDataSet.Tables.Add(_dt.Clone());

                exportDataSet.WriteXml(String.Format("{0}\\{1}", Application.StartupPath, "data.xml"), System.Data.XmlWriteMode.IgnoreSchema);
            }
        }

        private void teMaxZipFolder_EditValueChanged(object sender, EventArgs e)
        {
            lblValueMaxZipFolder.Text = teMaxZipFolder.Value.ToString();
        }

        private void teMaxZipFile_EditValueChanged(object sender, EventArgs e)
        {
            lblValueMaxZipFile.Text = teMaxZipFile.Value.ToString();
        }
    }
}

08.08.2012 - 17:31 Uhr

Datenbank-System: MSSQL

Hallo zusammen,

ich erhoffe mir diesmal ein wenig Hilfe was ich hier noch falsch mache, bzw. was noch fehlt ...

Folgendes passiert in einem Programm von mir:

  1. Ein XtraGrid (DevExpress) wird über XPCollection mit Werten aus einer MS SQL View gefüllt.

FrmTest (Windows Form)


namespace TestXPO
{
    public partial class FrmTest : Form
    {
        public FrmTest()
        {
            InitializeComponent();

            GetData();
        }

        // Füllt das Main-Xtragrid
        private void GetData()
        {
            XpoGetData.GetGridView(ref xtraGrid, typeof(sqlView), "main");
        }

        // Ruft den PopupControlContainer auf
        private void GetDataDetail(object sender, ItemClickEventArgs e)
        {
                var where = new StringBuilder();

                if (xtraGridView.SelectedRowsCount != 0)
                {
                    where.AppendFormat("detail_guid IN (");

                    foreach (int row in xtraGridView.GetSelectedRows())
                    {
                        where.AppendFormat("'{0}', ", xtraGridView.GetRowCellValue(row, xtraGridView.Columns["main_guid"]));
                    }

                    where.Remove(where.Length - 2, 2);
                    where.Append(")");
                }

                PopupControlContainer.Controls.Add(new FrmPopup(typeof(detail), "detail", where.ToString()));
        }
    }
}

Jetzt habe ich zusätzlich eine PopupControlContainer welcher, in Abhängigkeit des gewählten Datensatzes im XtraGrid, eine weitere Form öffnen soll in welcher erneut ein XtraGrid ist mit den abhängigen Daten (ebenfalls über XPO).

Hierzu wird GetDataDetail() aufgerufen welches wiederrum in FrmPopup (Windows Forms) wechselt.


namespace TestXPO
{
    public partial class FrmPopup : BaseUserControl
    {
        // Füllt das XtraGrid in dieser Form über XPO Aufruf
        public FrmPopup(Type _object, String table, String whereClause)
        {
            InitializeComponent();

            XpoGetData.GetGridView(ref xtraGrid, _object, table, whereClause);
        }
    }
}

Datei XpoGetData:

namespace TestXPO
{
        public static void GetGridView(ref GridControl dgv, Type _object, String table, String whereClause)
        {
            var where = new StringBuilder();

            var data = new XPCollection(_object);
            data.CriteriaString = where.ToString();
            dgv.DataSource = data;
        }
}

Das alles funktioniert wunderbar und jetzt zum großen ABER ...

Es funktioniert beim ersten Mal wenn ich im Hauptgrid einen Datensatz (oder mehrere) anwähle. Das Popup öffnet sich und die erwarteten Daten im Subgrid werden angezeigt.

Wechsel ich im Hauptgrid jedoch den Datensatz so bekomme ich im Subgrid die exakt vorher angezeigten Datensätze angezeigt - und das obwohl die übergebenen Parameter definitiv unterschiedlich sind und das angezeigte SQL Skript (im Query Analyser geprüft) auch anders wie zuvor ist.

Es scheint als ob XPO ein Refresh fehlt (oder dem PopupControlContainer)...

Kennt jemand eine Lösung ???

26.04.2012 - 17:24 Uhr

Hallo zusammen,

folgendes steht hier aktuell im Raum: ich möchte eine komplette Applikation multisprachenfähig designen. Wichtig ist dass die kompletten Übersetzungen innerhalb einer SQL Server 2008 Tabelle stehen und zur Laufzeit (UserControl-Start) gezogen und genutzt werden.

Hintergrund dieser Vorgehensweise ist:

a) ich kann benutzerbezogen jegliche Änderung über Trigger in Logtabellen speichern und zu jedem Stand zurück
b) identische Felder in unterschiedlichen UserControls können durchaus unterschiedliche Übersetzungen haben
c) fehlt eine Übersetzung kann ich das entsprechende Feld automatisch in die SQL Tabelle inkl. dem Standardtext speichern und so eine schnelle Übersetzung ohne Administrator oder Übersetzer ermöglichen

Bislang löse ich das über DataReader - was jedoch aufgrund der Datenmenge teilweise zu erheblichen Performanceproblemen geführt hat. Daher habe ich mich für die XPServerCollectionSource von DevExpress entschieden was bei den Grids auch super funktioniert und extrem schnell ist.

Was ich nun suche ist eine Möglichkeit die DataTables ebenfalls über die XPServerCollectionSource zu füllen damit ich nicht unterschiedliche Zugriffswege habe sondern einheitlichen Quellcode nutze.

Hat schon einmal jemand ein DataTable über die XPServerCollectionSource gefüllt oder kennt einen Weg die XPServerCollectionSource Datensatzweise zu durchlaufen ?

Folgenden Quellcode nutze ich aktuell um ein Grid zu füllen:

        private void GetData()
        {
            try
            {
                if (pcContainer.Visibility == DockVisibility.Visible)
                {
                    XPClassInfo class = XpoDefault.Session.GetClassInfo(typeof(sqldata));
                    CriteriaOperator crit = CriteriaOperator.Parse("[guid] = ?", teGuid.Text);
                    XPServerCollectionSource coll = new XPServerCollectionSource(XpoDefault.Session, class, crit);
                    grid.DataSource = coll;
                }
            }
            catch (Exception f)
            {
                SystemLog.WriteToEventLog(Application.ProductName, "", f.ToString());
            }
        }
12.03.2012 - 16:06 Uhr

stimmt - habe ich wohl nicht richtig gesehen 😦

Danke für den Hinweis - ist jetzt gelöst und wieder extrem schnell grins

12.03.2012 - 12:26 Uhr

Ist richtig - jetzt kommt aber der Haken an der Sache 😃

Es kommen DevExpress Komponenten zum Einsatz und mittels dem XPO funktioniert das auch richtig gut (0.130 Sekunden). Jedoch brauche ich so nette Features wie: Drucke mir alle selektierten Datensätze, lösche alle selektierten Datensätze - je im Grid

Und da es mit der XPServerCollection und XPO kein DataTable gibt ...

12.03.2012 - 12:05 Uhr

Du wirst lachen - es macht sogar Sinn !

Die haben 100.000 Datensätze und gehen dann Schrittweise vor um die zu löschen (Multiselect). Vorher suchen die aber Inkrementell im Grid

Die 2 Sekunden sind inkl. Anzeige - ich finde es auch schnell - aber das Altsystem ist sofort da (Läd im Hintergund nach, was bei der inkrementellen Suche nicht schadet - bevor die da Eingeben ist der fertig - aber dieses subjektive Empfinden stört anscheinend)

12.03.2012 - 11:46 Uhr

Datenbanksystem: MSSQL 2008R2

Hallo mal wieder,

ich stehe aktuell vor dem Problem dass ich in einigen Programmen XtraGrids füllen muss mit einer Unmenge an Datensätzen.

Ein eindeutiger Index liegt bereits in der SQL Tabelle vor und wird auch genutzt. Trotzdem habe ich bei wenigen Programmen das Problem dass da an die 180.000 Records zurück bekomme.

Nun meine Frage - was ist der schnellste Weg ein DataTable aus SQL zu füllen - kann ruhig über "SELECT * FROM xyz" laufen da eh alle Felder geholt werden ...

Innerhalb der XtraGrids finden auch keine Veränderungen statt - reine Anzeige

Ein DataReader braucht für 100.000 Datensätze ca. 2 Sekunden und das ist zu langsam wurde mir gesagt 😦

Hat jemand eine Idee ?

01.02.2012 - 02:25 Uhr

Ich habe es mehrfach analysiert da die Funktion mittlerweile durch die ganze Applikation durch implementiert ist.

Bei 20 Elementen wird die Multisprachen-Fähigkeit nicht bemerkt

Bei 100 Elementen merkt man es schon dramatisch

Dazu gesagt - alle UserControls arbeiten identisch, also keine besonderen Funktionen pro GUI oder so.

Es handelt sich um WinForm UserControls

Und dramatisch - naja - je schneller desto besser, da es aktuell um die Umstellung einer bestehenden Applikation nach .NET geht (und Performance wäre ein Grund für den Wechsel)

SuspendLayout() hilft nicht merkbar

Ich habe 2 Test-GUIs - eins mit 18 Elementen, eins mit 820 Elementen und der Unterschied liegt bei "nicht bemerkbar" zu "17 Sekunden" nur fürs Öffnen der GUI

Und am ändern der GUI Elemente kann es eigentlich nicht liegen - da wird permanent zur Laufzeit einiges aktualisiert (Farben im Grid, Enabled, ReadOnly, usw) und das belastet nicht merklich

01.02.2012 - 02:13 Uhr

Kurz und knapp, ich würde bei meinen Auftraggebern nach einem Zugang via VPN auf deren Server fragen (wo die Entwicklungs-Umgebung und somit auch die Lizenzen liegen).

Ich kann nicht so ganz nachvollziehen warum ein Kunde, wegen Teilprojekten, seinen gesamten Quellcode (und damit wahrscheinlich seine Geschäftsgrundlage) rausrücken würde an einen Externen ...

Also ich würde mal darüber nachdenken bevor ich sowas annehme - oder mich einfach da fest anstellen lassen für ein fürstliches Gehalt 😃

31.01.2012 - 23:38 Uhr

MSSQL Server 2008 R2

Hallo mal wieder zusammen - Neuer Tag = neues Problem ...

Ich versuche die Performance zu steigern im Bereich der dynamischen Übersetzung aller Elemente welche ich verwende (auf jeder GUI).

Es läuft alles über die MSSQL Server Datenbank welche den Benutzern die manuelle Anpassung einzelner Felder (Texte, Captions) durch ein Administrationsprogramm ermöglicht (inkl. Protokollierung).

Beim Start eines UserControls wird ein DataTable gefüllt, anschließend über ein

DataRow[] row = datatable.Select("spalte1 = {0} AND spalte2 = {1}", "test", "test2");

foreach (var ctrl in this.Controls)
{
    foreach (var dr in row)
    {
        if (ctrl.Name == dr[0].ToString())
            ctrl.Text = dr[1].ToString();
    }
}

wird für jedes Controls geprüft ob der Wert vorhanden ist und gegebenfalls die Übersetzung entsprechend aktualisiert.

Das funktioniert auch wunderbar - ist jedoch bei vielen Objekten merkbar langsamer wie mit sehr wenigen.

Gibt es hier eine schnellere Alternative zum DataTable.Select ???

Danke mal wieder

Michael

31.01.2012 - 23:23 Uhr

Ich habe es nun anders gelöst (Content Menü eingebettet). Sieht wesentlich besser aus (weil nicht da) 😃 und belastet die Gui auch nicht so ...

Danke an alle die sich beteiligt haben

30.01.2012 - 15:48 Uhr

MSSQL Server 2008 R2

Hallo zusammen,

ich bräuchte mal eure Hilfe, bzw. einen Denkanstoss ...

Folgendes Szenario: Ich hole über ein SELECT * FROM tabelle WHERE spalte1 BETWEEN '1' AND '100' einige Datensätze.

Jetzt beinhaltet in dieser Tabelle die spalte2 Werte welche sich innerhalb des Ergebnisses durchaus etliche Male wiederholen können. Diesbezüglich möchte ich wissen wie häufig diese spalte2 vorkommt (also wieviele unterschiedliche Werte da drin stehen)

Beispiel:

1 A
2 B
3 C
4 D
5 A

Die gefundenen Werte sollten für dieses Beispiel immer 4 sein, da 4 unterschiedliche Werte in spalte2 stehen ...

Geht das in einem Select oder muss ich mir ein zusätzliches Select basteln welches lediglich ein SELECT COUNT(DISTINCT spalte2) FROM tabelle WHERE ... beinhaltet ?

Danke und Gruß

23.01.2012 - 17:41 Uhr

Die beiden Buttons sollen auch innerhalb der ListBox stehen da der Textinhalt nie bis an den rechten Rand kommen wird.

Optisch ist die Listbox in der Breite an andere Controls angepasst - von daher ist das möglich ...

23.01.2012 - 13:46 Uhr

Hallo mal wieder,

aktuell stehe ich vor einem Designproblem 😃

Ich habe ein CheckedListBoxControl auf meiner Form in welchem ich unten rechts 2 Buttons (alle, keine) positioniert habe. Diese haben auch die optimale Ausrichtung wenn sich die Form vergrößert oder verkleinert.

Wenn ich die CheckedListBox jetzt mit Daten fülle kommt es ab einer bestimmten Menge Daten dazu dass die Scrollleiste eingeblendet wird. In diesem Fall hätte ich gerne dass die Buttons ein wenig nach links rutschen um diese nicht mehr zu überdecken.

An für sich die Anzahl Daten in der CheckedListBox zählen und sobald eine bestimmte Menge überschritten wird - nach links ziehen ...

Das funktioniert jedoch nur wenn die gesamte Form sich nicht vergrößert da es dann die CheckedListBox auch tut (nach rechts und nach unten).

Wie bekommt man sowas hin (sofern ich mich verständlich genug ausgedrückt habe) ?

Danke schon einmal fürs Grübeln

Michael

15.12.2011 - 00:52 Uhr

Also DevExpress ist fester Bestandteil der bisherigen Umgebung (und liefert auch etlich "geliebte" Vorteile)

Und die aktuelle Version (Demos - die ich davon auf dem Rechner habe - sind überwältigend) - scheinbar 5 Mio Datensätze in unter einer Sekunde im Grid ...

Real gewünscht sind 2 verschiedene Datenbank-Systeme (MSSQL und Oracle) - flexibel an mehreren Standorten eingesetzt aber an einem Standort gehostet.

Ich teste aktuell nur, um die schnellste Performance für eine .NET Applikation zu ermitteln (diese soll zukünftig eine eDeveloper Applikation, von mir geschaffen in 2003, ablösen) ...

Und mit DevExpress kenne ich mich besser aus (aus vorherigen Projekten) wie mit den Standard Komponenten

Wenn einer ein ähnliches Verfahren nennt (performance kritisch + globaler Zugriff) - ich bin gerne bereit das zu testen ob es für meinen Fall in Betracht kommt - sind Mrd. Datensätze pro Tag die angefordert werden bei einer DB von ca. 8 GB (nicht viel aber extrem häufige Zugriffe) - kommt durch die Pflicht-Transaktions-Speicherung bei jedem Zugriff ...

14.12.2011 - 20:07 Uhr
  1. da mache ich aktuell einen Wechsel aufs XPO von DevExpress da mir OleDb zu langsam ist bei der Datenmenge 😦 und ich zusätzlich neben dem SQL Server auch noch Oracle unterstützen muss

  2. In dem Fall ist das richtig, aber ich möchte es gerne einheitlich halten und fast alle anderen Methoden sind um ein vielfaches Größer

  3. Das mit dem Close wusste ich im Fall von using nicht - Danke !

  4. Aktuell schon, muss ich jedoch ändern beim Wechsel auf XPO ... und bin auch aktuell dabei

14.12.2011 - 15:25 Uhr

Gelöst und somit ein herzliches Danke an Karill Endusa

        public static int Get_Nummer(Guid? benutzer)
        {
            int results;

#region SQL
            var sql = new StringBuilder();
            sql.Append("SELECT TOP 1 ");
            sql.Append("a.sys_nummer ");
            sql.Append("FROM system a ");
            sql.Append("WHERE a.sys_benutzer_guid = ? ");
#endregion
            using (var conn = new OleDbConnection(Connection))
            {
                var cmd = new OleDbCommand(sql.ToString(), conn);

#region Parameter
                cmd.Parameters.Add("@benutzer", OleDbType.Guid, 33).Value = benutzer;
#endregion

                conn.Open();
                results = Convert.ToInt32(cmd.ExecuteScalar());
                conn.Close();
            }
            
            return results;
        }

Ausser einer hat noch Verbesserungsvorschläge für mich 😃

14.12.2011 - 15:11 Uhr

Hallo mal wieder,

aktuell arbeite ich mich in OLEDB ein und stehe nun vor dem Problem dass ich aus einem SQL Table nur einen numerischen Wert brauche (SELECT TOP 1 nummer FROM tabelle WHERE benutzer = 'abc') - den aber permanent und immer aktuell (wird pro Benutzer eine andere nummer sein und die kann sich auch zur Laufzeit ändern).

Gibt es eine Möglichkeit diese Nummer sofort in einen Int32 Wert zu packen oder muss ich ein DataSet/Datatable mit dem einen Wert füllen und dieses dann durchlaufen ?

Ich hoffe es ist verständlich was ich meine ...

27.10.2011 - 12:55 Uhr

Hallo mal wieder,

ich habe hier auf meinen Entwicklungsrechner ein vollständig installiertes Visual Studio 2008 inkl. Integration von DevComponents und DevExpress.

Jetzt habe ich soeben ein Visual Studio 2010 zusätzlich installiert und mein Projekt dort importiert - funktioniert alles einwandfrei.

Wenn ich jetzt jedoch innerhalb der Toolbar schaue so fehlen mir die Einträge für DevComponents und DevExpress.

Muss ich diese manuell hinzufügen oder gibt es hierfür eine Ex- Importfunktion ?

Gruß und Danke

Michael