Laden...

Profil von KenchU

myCSharp.de - Member Mitglied seit
KenchU
myCSharp.de - Member
3
Themen
79
Beiträge
Dabei seit
07.02.2005
Letzte Aktivität
vor 14 Jahren
Alter
56 Jahre
Beruf
Softwareentwickler
Herkunft
Göttingen
Interessen
PC, Web, WoW
Erstellt vor 14 Jahren

Vielen Dank für die Antworten. Ich schaue mir mal ILSpy an und werde dann wohl aber auch mal selbst sehen, wie ich am elegantesten an die gewünschten Informationen komme 😃

Erstellt vor 14 Jahren

Hallo,

ich suche ein Werkueg, um eine Liste aller Klassen und Idealerweise aller Methoden einer Klasse eines C#-Projektes zu extrahieren, z.B. nach CSV, SQL oder was auch immer.
Natürlich kann ich sowas auch selbst über Reflection angehen, doch warum das Rad neu erfinden (und so weiter) 😃
Erster gedanke war, mitteln ndoc ein Extrakt zu bekommen und dann wieder zu kürzen, ein dediziertes Tool, welches mir z.B. Klasse - Namespace - Methode zurückgibt, wäre natürlich besser. Oder doch besser gleich selbst sowas schreiben?

Vielleicht hat ja jemand eine Idee oder nen Tipp...

Vielen Dank schon mal

Erstellt vor 15 Jahren

Eine nicht ganz so einfache und auch nicht so wahnsinnig saubere Alternative: Über die Metadaten der DB gehen, also in etwa so (alles aus'm Stehgreif)


SELECT  OBJ.name
FROM     syscolumns COL
INNER JOIN SYSOBJECTS OBJ ON COL.id = OBJ.ID AND OBJ.TYPE = 'N'
WHERE   COL.name = 'h_id'

Bei dem 'N' bin ich mir nicht sicher; auf jeden Fall sollen alle Tabellen selektiert werden, in denen es ein Feld 'h_id' gibt.

Anschließend könnte man mittels dynamisch erzeugtem SQL die gefundenen Tabellen nach der jeweiligen id durchsuchen/Sätze löschen etc.

Vorteil ist halt, wenn eine neue Tabelle hinzukommt, wird sie automatisch hier mit berücksichtigt

Erstellt vor 15 Jahren

Hallo,

ich habe einen recht einfachen GridView:


    <asp:GridView ID="myGrid" runat="server" AutoGenerateColumns="false" 
        OnRowCreated="myGrid_OnRowCreated">
        <Columns>
            <asp:BoundField DataField="col1" HeaderText="Name" />
            <asp:BoundField DataField="col2" HeaderText="Datum" />
            <asp:BoundField DataField="col3a" HeaderText="Kat1" />
            <asp:BoundField DataField="col3b" HeaderText="Kat2" />
            <asp:BoundField DataField="col3c" HeaderText="Kat3" />
            <asp:ButtonField ButtonType="Image" HeaderText="PDF" ImageUrl="pdf.jpg" />
        </Columns>
    </asp:GridView>

Hier wollte ich nun über den Spalten col3a, col3b, col3c eine gemeinsame überschrift (colspan=3) und jeweils eine eigene überschrift, also alle anderen spalten rowspan=2. Hinbekommen habe ich das über das OnRowCreated-event:


        protected void myGrid_OnRowCreated(object sender, GridViewRowEventArgs e)
        {
            GridView oGridView = (GridView)sender;

            if (e.Row.RowType == DataControlRowType.Header)
            {
                GridViewRow oGridViewRow = new GridViewRow(0, 0, DataControlRowType.Header, DataControlRowState.Insert);
                TableCell oTableCell;

                oTableCell = new TableCell();
                oTableCell.Font.Bold = true;
                oTableCell.Text = "Name";
                oTableCell.RowSpan = 2;
                oGridViewRow.Cells.Add(oTableCell);

                oTableCell = new TableCell();
                oTableCell.Font.Bold = true;
                oTableCell.Text = "Datum";
                oTableCell.RowSpan = 2;
                oGridViewRow.Cells.Add(oTableCell);

                oTableCell = new TableCell();
                oTableCell.Font.Bold = true;
                oTableCell.Text = "Kategorien";
                oTableCell.HorizontalAlign = HorizontalAlign.Center;
                oTableCell.RowSpan = 1;
                oTableCell.ColumnSpan = 3;
                oGridViewRow.Cells.Add(oTableCell);

                oTableCell = new TableCell();
                oTableCell.Font.Bold = true;
                oTableCell.Text = "PDF";
                oTableCell.HorizontalAlign = HorizontalAlign.Center;
                oTableCell.RowSpan = 2;
                oGridViewRow.Cells.Add(oTableCell);

                oGridView.Controls[0].Controls.AddAt(0, oGridViewRow);

                oGridViewRow = new GridViewRow(0, 0, DataControlRowType.Header, DataControlRowState.Insert);

                oTableCell = new TableCell();
                oTableCell.Font.Bold = true;
                oTableCell.Text = "Eins";
                oTableCell.HorizontalAlign = HorizontalAlign.Center;
                oGridViewRow.Cells.Add(oTableCell);

                oTableCell = new TableCell();
                oTableCell.Font.Bold = true;
                oTableCell.Text = "Zwei";
                oTableCell.HorizontalAlign = HorizontalAlign.Center;
                oGridViewRow.Cells.Add(oTableCell);

                oTableCell = new TableCell();
                oTableCell.Font.Bold = true;
                oTableCell.Text = "Drei";
                oTableCell.HorizontalAlign = HorizontalAlign.Center;
                oGridViewRow.Cells.Add(oTableCell);

                oGridView.Controls[0].Controls.AddAt(1, oGridViewRow);
            }

            // das muss doch schöner gehen!
            if (oGridView.Controls[0].Controls.Count == 3)
                oGridView.Controls[0].Controls[2].Visible = false;
        }

Klappt soweit alles, das Ergebnis ist wie gewünscht. Fein 😃
Aber: Man beachte den Kommentar ganz unten im C#-Code. Normalerweise werden die ursprünglichen Überschriften auch noch ausgegeben. Dies würde ich gerne unterdrücken bzw. wenn ich die neuen Überschriften gesetzt habe, die 'Überschriftengenerierung' beenden. Geht das? Ein weglassen im ASP.NET-Code bringt nichts; man bekommt leere Zellen.

Danke im Voraus

Erstellt vor 15 Jahren

Hallo,

du wirst nicht herum kommen, beide Werte zu prüfen:


// Ausgangssituation
SELECT Nachname + ', ' + Vorname AS [CustomerName]
FROM Personen

// NULL-Werte abfangen
SELECT ISNULL(Nachname, '') + ', ' + ISNULL(Vorname, '') AS [CustomerName]
FROM Personen

// Komma nur wenn keine NULL-Werte
SELECT ISNULL(Nachname, '') + CASE WHEN (Nachname IS NULL OR Vorname IS NULL) THEN '' ELSE ', ' END + ISNULL(Vorname, '') AS [CustomerName]
FROM Personen

Blöd und irgendwann unübersichtlich wird es, wenn noch mehr Werte zusammengefügt werden sollen, aber für Vor-/Nachname ist das noch ganz ok so, finde ich

Erstellt vor 15 Jahren

Du hast dir deine Antwort eigentlich schon selbst gegeben.

Ein DataSet hat die Methoden WriteXml und entsprechend auch ReadXml

Ein DataTable kann das natürlich auch beides 😃

Erstellt vor 15 Jahren

In deinem Codebeispiel setzt du das Value-Property einer Zelle. Dies ist aber nicht gleichbedeutend mit der Beschriftung des darun enthaltenen Button.

Möglichkeit 1: hat die Zelle einen ValueChanged-Event, kann sich der Button darauf klinken, das neue Value holen und seine Beschriftung 'selbst' ändern.
Möglichkeit 2: in der NewRow.Cells[5] gibt es eine Coltrols Colelction, dort suchst du den Button und setzt die Beschriftung

Erstellt vor 15 Jahren

ich Schätze mal, du suchst nach StyleSheetTheme

Erstellt vor 15 Jahren

Nochmal mein Testcode:


            SqlConnectionStringBuilder scb = new SqlConnectionStringBuilder();
            scb.DataSource = @"localhost\SQLEXPRESS";
            scb.InitialCatalog = "DBtest";
            scb.IntegratedSecurity = true;

            System.Text.Encoding e1 = FileEncoding(@"C:\Temp\encoding1.xml");
            System.Text.Encoding e2 = FileEncoding(@"C:\Temp\encoding2.xml");

            StreamReader s1 = new StreamReader(File.Open(@"C:\Temp\encoding1.xml", FileMode.Open, FileAccess.Read, FileShare.Read), Encoding.Default);
            StreamReader s2 = new StreamReader(File.Open(@"C:\Temp\encoding2.xml", FileMode.Open, FileAccess.Read, FileShare.Read), Encoding.Default);

            XDocument xd1 = XDocument.Load(new XmlTextReader(s1));
            XDocument xd2 = XDocument.Load(new XmlTextReader(s2));

            s1.Close();
            s2.Close();

            string sql1 = string.Format("INSERT INTO xdocs(xdoc) SELECT '{0}'", xd1.ToString());
            string sql2 = string.Format("INSERT INTO xdocs(xdoc) SELECT '{0}'", xd2.ToString());

            System.Data.SqlClient.SqlConnection con = new SqlConnection(scb.ConnectionString);
            con.Open();
            SqlCommand cmd1 = new SqlCommand(sql1, con);
            SqlCommand cmd2 = new SqlCommand(sql2, con);

            cmd1.ExecuteNonQuery();
            cmd2.ExecuteNonQuery();

            con.Close();

...

        private System.Text.Encoding FileEncoding(string filePath)
        {
            System.Text.Encoding enc = null;
            System.IO.FileStream file = new System.IO.FileStream(filePath,
                FileMode.Open, FileAccess.Read, FileShare.Read);
            if (file.CanSeek)
            {
                byte[] bom = new byte[4]; // Get the byte-order mark, if there is one
                file.Read(bom, 0, 4);
                if ((bom[0] == 0xef && bom[1] == 0xbb && bom[2] == 0xbf) || // utf-8
                    (bom[0] == 0xff && bom[1] == 0xfe) || // ucs-2le, ucs-4le, and ucs-16le
                    (bom[0] == 0xfe && bom[1] == 0xff) || // utf-16 and ucs-2
                    (bom[0] == 0 && bom[1] == 0 && bom[2] == 0xfe && bom[3] == 0xff)) // ucs-4
                {
                    enc = System.Text.Encoding.Unicode;
                }
                else
                {
                    enc = System.Text.Encoding.ASCII;
                }

                // Now reposition the file cursor back to the start of the file
                file.Seek(0, System.IO.SeekOrigin.Begin);
            }
            else
            {
                // The file cannot be randomly accessed, so you need to decide what to set the default to
                // based on the data provided. If you're expecting data from a lot of older applications,
                // default your encoding to Encoding.ASCII. If you're expecting data from a lot of newer
                // applications, default your encoding to Encoding.Unicode. Also, since binary files are
                // single byte-based, so you will want to use Encoding.ASCII, even though you'll probably
                // never need to use the encoding then since the Encoding classes are really meant to get
                // strings from the byte array that is the file.

                enc = System.Text.Encoding.ASCII;
            }

            file.Close();

            return enc;
        }


Die beiden Dateien sind einem als ANSI, einmal als unicode codiert; Inhalt identisch. Beide kommen korrekt in die Datenbank (SQLexpress) ...

Erstellt vor 15 Jahren

ohne jetzt eine konkrete Lösung bieten zu können: Ich sehe nicht, daß du irgendwo das encoding auf UTF-8 umsetzt. Wenn ich mich recht entsinne, arbeitet .NET intern grundsätzlich mit unicode.
Du änderst das encoding ja nicht, sondern übernimmst das aus der quelle.

Versuch's mal so in der Art:


            StreamReader s1 = new StreamReader(File.Open(@"C:\Temp\encoding1.xml", FileMode.Open, FileAccess.Read, FileShare.Read), Encoding.Default);
            StreamReader s2 = new StreamReader(File.Open(@"C:\Temp\encoding2.xml", FileMode.Open, FileAccess.Read, FileShare.Read), Encoding.Default);

Ich habe das Testweise mit einer UTF-8 und einer ANSI-Datei gemacht, diese dann in ein XDocument gelesen


            XDocument xd1 = XDocument.Load(new XmlTextReader(s1));
            XDocument xd2 = XDocument.Load(new XmlTextReader(s2));

Und beide waren identisch, also OK.

zuvor hatte ich das geliche getestet indem ich die encodings der Quelldateien übernomen habe, da waren die XDocuments unterschiedlich:


            System.Text.Encoding e1 = FileEncoding(@"C:\Temp\encoding1.xml");
            System.Text.Encoding e2 = FileEncoding(@"C:\Temp\encoding2.xml");

            StreamReader s1 = new StreamReader(File.Open(@"C:\Temp\encoding1.xml", FileMode.Open, FileAccess.Read, FileShare.Read), e1);
            StreamReader s2 = new StreamReader(File.Open(@"C:\Temp\encoding2.xml", FileMode.Open, FileAccess.Read, FileShare.Read), e2);