【问题标题】:Populate Gridview from Data Table从数据表填充 Gridview
【发布时间】:2014-03-28 11:47:18
【问题描述】:

我正在尝试从数据表中填充 Gridview。但是,当我运行代码时,Gridview 中根本没有显示任何内容。代码如下:

string serverIP = drpServer.SelectedItem.Value.ToString();
ManagementObjectSearcher searcher = new ManagementObjectSearcher(@"\\" + serverIP + "\\root\\CIMV2", "SELECT * FROM Win32_PerfFormattedData_PerfProc_Process");

        foreach (ManagementObject query in searcher.Get())
        {               
            var processName = query["Name"];
            var processID = query["IDProcess"];
            var cpuTime = query["PercentProcessorTime"];
            var memUsage = query["WorkingSet"];

            double newMemUsage = Convert.ToDouble(memUsage);

            newMemUsage = newMemUsage / 1024;

            DataTable dt = new DataTable();
            dt.Columns.Add("ProcessName", typeof(string));
            dt.Columns.Add("ProcessID", typeof(int));
            dt.Columns.Add("CPUTime", typeof(string));
            dt.Columns.Add("MemoryUsage", typeof(string));

            DataRow row = dt.NewRow();
            row["ProcessName"] = processName;
            row["ProcessID"] = processID;
            row["CPUTime"] = cpuTime;
            row["MemoryUsage"] = newMemUsage;
            dt.Rows.Add(row);

            GridView1.DataSource = dt;
            GridView1.DataBind();

比起使用 Diagnostics.Process,我更喜欢 Management Object Searcher,这就是我选择这条路线的原因。

我也在我的 Gridview 中创建了绑定字段。

【问题讨论】:

    标签: c# gridview datatable


    【解决方案1】:

    为什么你的foreach 包裹了整个过程?这将在您每次收到新查询时创建一个全新的DataTable。我认为您的意思是执行以下操作,仅包装添加行部分:

    string serverIP = drpServer.SelectedItem.Value.ToString();
    ManagementObjectSearcher searcher = new ManagementObjectSearcher(@"\\" + serverIP + "\\root\\CIMV2", "SELECT * FROM Win32_PerfFormattedData_PerfProc_Process");
    
    DataTable dt = new DataTable();
    dt.Columns.Add("ProcessName", typeof(string));
    dt.Columns.Add("ProcessID", typeof(int));
    dt.Columns.Add("CPUTime", typeof(string));
    dt.Columns.Add("MemoryUsage", typeof(string));
    
    foreach (ManagementObject query in searcher.Get())
    {   
        var processName = query["Name"];
        var processID = query["IDProcess"];
        var cpuTime = query["PercentProcessorTime"];
        var memUsage = query["WorkingSet"];
    
        double newMemUsage = Convert.ToDouble(memUsage);
    
        newMemUsage = newMemUsage / 1024;
    
        DataRow row = dt.NewRow();
        row["ProcessName"] = processName;
        row["ProcessID"] = processID;
        row["CPUTime"] = cpuTime;
        row["MemoryUsage"] = newMemUsage;
        dt.Rows.Add(row);
    }
    
    GridView1.DataSource = dt;
    GridView1.DataBind();
    

    【讨论】:

    • 谢谢。我没有注意到。我进行了更改,它现在看起来正在填充,但所有行都是空白的。我将调试并查看是否正在写入值。
    • 没问题。这可能是您的查询本身的问题。如果您在double newMemUsage 设置断点,您应该能够查看是否有processName 的任何值等。然​​后您可以在foreach 的末尾括号设置另一个断点以查看dt 是否包含结果集中的任何值(在 Watch 或 Locals 下)。
    • 我在控制台应用程序中通过此操作,这样我就可以绕过 gridview 并将数据写入控制台。从我的下拉列表中获取正确的值可能存在问题。我会调试一下看看。谢谢大家的帮助。
    • 我在我的 aspx 页面中创建了这些列,但我需要将这些值设置为什么吗?除绑定外,一切正常。
    • 我没有定义数据字段。一旦我这样做了,一切都会填充。
    猜你喜欢
    • 2012-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-27
    • 1970-01-01
    • 1970-01-01
    • 2014-05-12
    • 1970-01-01
    相关资源
    最近更新 更多