Wie kann ich den Inhalt einer Datentabelle oder Datenansicht einfach im unmittelbaren Fenster anzeigen?

86

Manchmal bin ich an einem Haltepunkt in meinem Code und möchte den Inhalt einer DataTableVariablen (oder a DataTablein a DataSet) anzeigen . Die Schnelluhr gibt Ihnen keine sehr klare Sicht auf den Inhalt. Wie kann ich sie einfach anzeigen?

adinas
quelle
An welcher Version von Visual Studio arbeiten Sie?
Gerrie Schenck
1
Warum nicht dann die eingebauten Visualisierer verwenden?
Gerrie Schenck

Antworten:

168

Der Visual Studio-Debugger wird mit vier Standard-Visualisierern geliefert. Dies sind die Text-, HTML- und XML-Visualisierer, die alle für Zeichenfolgenobjekte funktionieren, und der Dataset-Visualisierer, der für DataSet-, DataView- und DataTable-Objekte funktioniert.

Um es zu verwenden, brechen Sie in Ihren Code ein, fahren Sie mit der Maus über Ihr DataSet, erweitern Sie die Schnellüberwachung, zeigen Sie die Tabellen an, erweitern Sie diese und zeigen Sie dann beispielsweise Tabelle [0] an. Sie werden so etwas wie {} Tabelle 1 in der schnellen Uhr wird sehen, aber feststellen , dass es auch eine ist Symbol Lupe . Klicken Sie auf dieses Symbol und Ihre DataTable wird in einer Rasteransicht geöffnet.

Geben Sie hier die Bildbeschreibung ein

Rob Prouse
quelle
15

Um die Debugger-Ausgabe von adinas zu verschönern, habe ich einige einfache Formatierungen vorgenommen:

    public void DebugTable(DataTable table)
    {
        Debug.WriteLine("--- DebugTable(" + table.TableName + ") ---");
        int zeilen = table.Rows.Count;
        int spalten = table.Columns.Count;

        // Header
        for (int i = 0; i < table.Columns.Count; i++)
        {
            string s = table.Columns[i].ToString();
            Debug.Write(String.Format("{0,-20} | ", s));
        }
        Debug.Write(Environment.NewLine);
        for (int i = 0; i < table.Columns.Count; i++)
        {
            Debug.Write("---------------------|-");
        }
        Debug.Write(Environment.NewLine);

        // Data
        for (int i = 0; i < zeilen; i++)
        {
            DataRow row = table.Rows[i];
            //Debug.WriteLine("{0} {1} ", row[0], row[1]);
            for (int j = 0; j < spalten; j++)
            {
                string s = row[j].ToString();
                if (s.Length > 20) s = s.Substring(0, 17) + "...";
                Debug.Write(String.Format("{0,-20} | ", s));
            }
            Debug.Write(Environment.NewLine);
        }
        for (int i = 0; i < table.Columns.Count; i++)
        {
            Debug.Write("---------------------|-");
        }
        Debug.Write(Environment.NewLine);
    }

Das Beste an dieser Lösung: Sie benötigen Visual Studio nicht ! Hier meine Beispielausgabe:

SELECT PackKurz, PackName, PackGewicht FROM verpackungen

PackKurz | PackName | PackGewicht |
--------------------- | ---------------------- | ----- ----------------- | -
BB205 | BigBag 205 kg | 205 |
BB300 | BigBag 300 kg | 300 |
BB365 | BigBag 365 kg | 365 |
CO | Container, Alteru ... | |
EP | Palette | |
IBC | Chemikaliengefäß ... | |
verlieren | nicht verpackungs ... | 0 |
--------------------- | ---------------------- | ----- ----------------- | -
Luluha
quelle
1

Ich habe eine statische Klasse mit dem folgenden Code in meinem Projekt:

    #region Dataset -> Immediate Window
public static void printTbl(DataSet myDataset)
{
    printTbl(myDataset.Tables[0]);
}
public static void printTbl(DataTable mytable)
{
    for (int i = 0; i < mytable.Columns.Count; i++)
    {
        Debug.Write(mytable.Columns[i].ToString() + " | ");
    }
    Debug.Write(Environment.NewLine + "=======" + Environment.NewLine);
    for (int rrr = 0; rrr < mytable.Rows.Count; rrr++)
    {
        for (int ccc = 0; ccc < mytable.Columns.Count; ccc++)
        {
            Debug.Write(mytable.Rows[rrr][ccc] + " | ");
        }
        Debug.Write(Environment.NewLine);
    }
}
public static void ResponsePrintTbl(DataTable mytable)
{
    for (int i = 0; i < mytable.Columns.Count; i++)
    {
        HttpContext.Current.Response.Write(mytable.Columns[i].ToString() + " | ");
    }
    HttpContext.Current.Response.Write("<BR>" + "=======" + "<BR>");
    for (int rrr = 0; rrr < mytable.Rows.Count; rrr++)
    {
        for (int ccc = 0; ccc < mytable.Columns.Count; ccc++)
        {
            HttpContext.Current.Response.Write(mytable.Rows[rrr][ccc] + " | ");
        }
        HttpContext.Current.Response.Write("<BR>");
    }
}

public static void printTblRow(DataSet myDataset, int RowNum)
{
    printTblRow(myDataset.Tables[0], RowNum);
}
public static void printTblRow(DataTable mytable, int RowNum)
{
    for (int ccc = 0; ccc < mytable.Columns.Count; ccc++)
    {
        Debug.Write(mytable.Columns[ccc].ToString() + " : ");
        Debug.Write(mytable.Rows[RowNum][ccc]);
        Debug.Write(Environment.NewLine);
    }
}
#endregion

Ich werde dann eine der oben genannten Funktionen im unmittelbaren Fenster aufrufen und die Ergebnisse werden auch dort angezeigt. Wenn ich beispielsweise den Inhalt einer Variablen 'myDataset' sehen möchte, rufe ich printTbl (myDataset) auf. Nach dem Drücken der Eingabetaste werden die Ergebnisse im unmittelbaren Fenster gedruckt

adinas
quelle
1

Probieren Sie Xml Visualizer aus . Ich habe die neueste Version noch nicht ausprobiert, kann aber ohne die vorherige Version in Visual Studio 2003 nicht arbeiten.

Neben der hierarchischen Anzeige von DataSet gibt es noch viele andere nützliche Funktionen, z. B. das Filtern und Auswählen des RowState, den Sie anzeigen möchten.

Gerrie Schenck
quelle
1
public static void DebugDataSet ( string msg, ref System.Data.DataSet ds )
{
    WriteIf ( "===================================================" + msg + " START " );
    if (ds != null)
    {
        WriteIf ( msg );
        foreach (System.Data.DataTable dt in ds.Tables)
        {
            WriteIf ( "================= My TableName is  " +
            dt.TableName + " ========================= START" );
            int colNumberInRow = 0;
            foreach (System.Data.DataColumn dc in dt.Columns)
            {
                System.Diagnostics.Debug.Write ( " | " );
                System.Diagnostics.Debug.Write ( " |" + colNumberInRow + "| " );
                System.Diagnostics.Debug.Write ( dc.ColumnName + " | " );
                colNumberInRow++;
            } //eof foreach (DataColumn dc in dt.Columns)
            int rowNum = 0;
            foreach (System.Data.DataRow dr in dt.Rows)
            {
                System.Diagnostics.Debug.Write ( "\n row " + rowNum + " --- " );
                int colNumber = 0;
                foreach (System.Data.DataColumn dc in dt.Columns)
                {
                    System.Diagnostics.Debug.Write ( " |" + colNumber + "| " );
                    System.Diagnostics.Debug.Write ( dr[dc].ToString () + " " );
                    colNumber++;
                } //eof foreach (DataColumn dc in dt.Columns)
                rowNum++;
            }   //eof foreach (DataRow dr in dt.Rows)
            System.Diagnostics.Debug.Write ( " \n" );
            WriteIf ( "================= Table " + dt.TableName + " ========================= END" );
            WriteIf ( "===================================================" + msg + " END " );
        }   //eof foreach (DataTable dt in ds.Tables)
    } //eof if ds !=null 
    else
    {
        WriteIf ( "NULL DataSet object passed for debugging !!!" );
    }
} //eof method 

public static void WriteIf ( string msg )
{
    //TODO: FIND OUT ABOUT e.Message + e.StackTrace from Bromberg eggcafe
int output = System.Convert.ToInt16(System.Configuration.ConfigurationSettings.AppSettings["DebugOutput"] );
    //0 - do not debug anything just run the code 
switch (output)
{
    //do not debug anything 
    case 0:
        msg = String.Empty;
    break;
        //1 - output to debug window in Visual Studio       
        case 1:
            System.Diagnostics.Debug.WriteIf ( System.Convert.ToBoolean( System.Configuration.ConfigurationSettings.AppSettings["Debugging"] ), DateTime.Now.ToString ( "yyyy:MM:dd -- hh:mm:ss.fff --- " ) + msg + "\n" );
            break;
        //2 -- output to the error label in the master 
        case 2:
            string previousMsg = System.Convert.ToString (System.Web.HttpContext.Current.Session["global.DebugMsg"]);
            System.Web.HttpContext.Current.Session["global.DebugMsg"] = previousMsg +
            DateTime.Now.ToString ( "yyyy:MM:dd -- hh:mm:ss.fff --- " ) + msg + "\n </br>";
            break;
        //output both to debug window and error label 
        case 3:
            string previousMsg1 = System.Convert.ToString (System.Web.HttpContext.Current.Session["global.DebugMsg"] );
            System.Web.HttpContext.Current.Session["global.DebugMsg"] = previousMsg1 + DateTime.Now.ToString ( "yyyy:MM:dd -- hh:mm:ss.fff --- " ) + msg + "\n";
            System.Diagnostics.Debug.WriteIf ( System.Convert.ToBoolean( System.Configuration.ConfigurationSettings.AppSettings["Debugging"] ), DateTime.Now.ToString ( "yyyy:MM:dd -- hh:mm:ss.fff --- " ) + msg + "\n </br>" );
            break;
        //TODO: implement case when debugging goes to database 
    } //eof switch 

} //eof method WriteIf
Yordan Georgiev
quelle
1

und wenn Sie möchten, dass dies irgendwo ... ein Helfer für DataTable ist, wird davon ausgegangen, dass Sie die Ausgabe in Log4Net erfassen möchten, aber das hervorragende Startbeispiel, gegen das ich nur mit Dumps auf der Konsole gearbeitet habe ... Dieses hat auch die bearbeitbare Spaltenbreitenvariable nMaxColWidth - Letztendlich werde ich das aus jedem Kontext weitergeben ...

public static class Helpers
    {
        private static ILog Log = Global.Log ?? LogManager.GetLogger("MyLogger");
        /// <summary>
        /// Dump contents of a DataTable to the log
        /// </summary>
        /// <param name="table"></param>
        public static void DebugTable(this DataTable table)
        {
            Log?.Debug("--- DebugTable(" + table.TableName + ") ---");
            var nRows = table.Rows.Count;
            var nCols = table.Columns.Count;
            var nMaxColWidth = 32;

            // Column Headers

            var sColFormat = @"{0,-" + nMaxColWidth + @"} | ";
            var sLogMessage = string.Empty;
            for (var i = 0; i < table.Columns.Count; i++)
            {
                sLogMessage = string.Concat(sLogMessage, string.Format(sColFormat, table.Columns[i].ToString()));
            }
            //Debug.Write(Environment.NewLine);
            Log?.Debug(sLogMessage);

            var sUnderScore = string.Empty;
            var sDashes = string.Empty;
            for (var j = 0; j <= nMaxColWidth; j++)
            {
                sDashes = sDashes + "-";
            }


            for (var i = 0; i < table.Columns.Count; i++)
            {
                sUnderScore = string.Concat(sUnderScore, sDashes + "|-");
            }

            sUnderScore = sUnderScore.TrimEnd('-');

            //Debug.Write(Environment.NewLine);
            Log?.Debug(sUnderScore);

            // Data
            for (var i = 0; i < nRows; i++)
            {
                DataRow row = table.Rows[i];
                //Debug.WriteLine("{0} {1} ", row[0], row[1]);
                sLogMessage = string.Empty;

                for (var j = 0; j < nCols; j++)
                {
                    string s = row[j].ToString();
                    if (s.Length > nMaxColWidth) s = s.Substring(0, nMaxColWidth - 3) + "...";
                    sLogMessage = string.Concat(sLogMessage, string.Format(sColFormat, s));
                }

                Log?.Debug(sLogMessage);
                //Debug.Write(Environment.NewLine);
            }           
            Log?.Debug(sUnderScore);
        }
}
Allen
quelle
1

Ich habe eine kleine Methode dafür programmiert. Es ist eine Generalisierungsfunktion.

    public static void printDataTable(DataTable tbl)
    {
        string line = "";
        foreach (DataColumn item in tbl.Columns)
        {
            line += item.ColumnName +"   ";
        }
        line += "\n";
        foreach (DataRow row in tbl.Rows)
        {
            for (int i = 0; i < tbl.Columns.Count; i++)
            {
                line += row[i].ToString() + "   ";
            }
            line += "\n";
        }
        Console.WriteLine(line) ;
    }
Sagte Muhammad Idrees
quelle
0

Ich habe es nicht selbst versucht, aber Visual Studio 2005 (und höher) unterstützt das Konzept von Debugger Visualizers. Auf diese Weise können Sie anpassen, wie ein Objekt in der IDE angezeigt wird. Weitere Informationen finden Sie in diesem Artikel.

http://davidhayden.com/blog/dave/archive/2005/12/26/2645.aspx

gilles27
quelle