【问题标题】:How can I easily view the contents of a datatable or dataview in the immediate window如何在即时窗口中轻松查看数据表或数据视图的内容
【发布时间】:2010-10-04 05:48:58
【问题描述】:

有时我会在代码中的断点处查看DataTable 变量(或DataSet 中的DataTable)的内容。快速观看并不能让您非常清楚地看到内容。如何轻松查看?

【问题讨论】:

  • 您正在使用哪个版本的 Visual Studio?
  • 那为什么不使用内置的可视化工具呢?

标签: c# .net asp.net visual-studio


【解决方案1】:

我已经为它编写了一个小方法.. 它是一个泛化函数..

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

【讨论】:

    【解决方案2】:

    Visual Studio 调试器附带四个标准可视化工具。这些是文本、HTML 和 XML 可视化工具,它们都适用于字符串对象,以及数据集可视化工具,适用于 DataSet、DataView 和 DataTable 对象。

    要使用它,请进入您的代码,将鼠标悬停在您的数据集上,展开快速查看,查看表格,展开该表格,然后查看 Table[0](例如)。您会在快速查看中看到类似 {Table1} 的内容,但请注意还有一个放大镜图标。单击该图标,您的 DataTable 将在网格视图中打开。

    【讨论】:

      【解决方案3】:

      如果你想在任何地方...成为 DataTable 的助手 这假设您想要将输出捕获到 Log4Net,但我处理的出色的起始示例只是转储到控制台...... 这个也有可编辑的列宽变量 nMaxColWidth - 最终我会从任何上下文传递它...

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

      【讨论】:

        【解决方案4】:

        为了美化阿迪纳斯的调试器输出,我做了一些简单的格式化:

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

        最佳解决方案:您不需要 Visual Studio! 这是我的示例输出:

        从 verpackungen 中选择 PackKurz、PackName、PackGewicht 包库兹 |包装名称 | PackGewicht | ----------|----------------------|------ ------|- BB205 |大袋 205 公斤 | 205 | BB300 |大袋 300 公斤 | 300 | BB365 |大袋 365 公斤 | 365 | 一氧化碳 |容器,Alteru... | | EP |调色板 | | 中型散货箱 | Chemikaliengefäß ... | | 输| nicht verpackungs... | 0 | ----------|----------------------|------ ------|-

        【讨论】:

          【解决方案5】:
          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
          

          【讨论】:

            【解决方案6】:

            试试Xml Visualizer。 还没有尝试过最新版本,但如果没有 Visual Studio 2003 中的上一个版本,我将无法工作。

            除了分层显示 DataSet 之外,还有许多其他方便的功能,例如过滤和选择要查看的 RowState。

            【讨论】:

              【解决方案7】:

              我自己没有尝试过,但 Visual Studio 2005(及更高版本)支持调试器可视化工具的概念。这允许您自定义对象在 IDE 中的显示方式。查看这篇文章了解更多详情。

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

              【讨论】:

                【解决方案8】:

                我所做的是在我的项目中有一个包含以下代码的静态类:

                    #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
                

                然后我将在即时窗口中调用上述函数之一,结果也会出现在那里。 例如,如果我想查看变量“myDataset”的内容,我将调用 printTbl(myDataset)。按回车后,结果将打印到即时窗口

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-02-20
                  • 1970-01-01
                  • 2015-05-05
                  相关资源
                  最近更新 更多