c# – 使用与pagemethod和webmethod相同的datatable的区别

前端之家收集整理的这篇文章主要介绍了c# – 使用与pagemethod和webmethod相同的datatable的区别前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试创建一个新网页,我需要为每个网格数据显示几乎10个不同的网格视图和图表.

Gridviews绑定在pageload事件上,并且使用jquery-ajax方法(使用amcharts以及highcharts)通过调用WebMethod来显示图表.

最初我实现了这样一种方式,即在执行存储过程gridview绑定后,在webmethod内部也执行相同的sp来绘制图表.同样的sp对该页面执行两次(一个用于网格,另一个用于图表).10 sps需要执行网格和图表10.

所以为了提高页面性能,我创建了这样的静态datatable

static DataTable Report1;

并像这样绑定gridview.

private void gvbindReport1()
    {
        try
        {            
            Report1 = new DataTable();//refreshed datatable 
            DataSet ReportDS1 = objmvbl.GetReportGraph(ClientID,date_From,date_To);
            if (ReportDS1.Tables.Count > 0)
            {
                Report1 = ReportDS1.Tables[0];//bindinding data to static datatable

            }
            GdReport.DataSource = Report1;
            GdReport.DataBind();
        }
        catch (Exception ex)
        {
            Log.Errlog("Error Occured in  gvbindReport1 : " + ex.Message.ToString());
        }

    }

并且在webmethod内部,我已经使用相同的datatable来绘制图表
喜欢这个

[System.Web.Services.WebMethod]
    public static string GetDataReport1()
    {
        System.Web.Script.Serialization.JavaScriptSerializer serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
        List<Dictionary<string,object>> rows = new List<Dictionary<string,object>>();
        Dictionary<string,object> row;
        try
        {
            //processing for the data inside static datatable
            if (Report1.Rows.Count > 0)
            {
                foreach (DataRow dr in Report1.Rows)
                {
                    row = new Dictionary<string,object>();
                    foreach (DataColumn col in Report1.Columns)
                    {
                        row.Add(col.ColumnName,dr[col]);
                    }
                    rows.Add(row);
                }
            }
        }
        catch (Exception ex)
        {
            Log.Errlog("Error Occured in  GetDataReport WebMethod of Report Page : " + ex.Message.ToString());
        }

        return serializer.Serialize(rows);

    }

与此我可以显示网格和图表.

现在请说说,这是处理webmethods的正确方法吗?我已经读过该webmethod与该页面和所有的没有任何关系.请告诉我这个方法的回退.

如果这是错误方法,请提供一些改进页面性能的想法?

解决方法

不,这不是正确的方法.由于您已将DataTable声明为静态(静态变量具有应用范围,无法实例化)

users will get the same result (last updated values).

您可以在concurrency测试中实现.

请检查以下情况:

考虑dtbl是在主页上初始化的静态dataTable,并在索引页面上创建另一个“datatable”实例实例(两者都在页面加载中,如下所示).

public static DataTable dtbl;
protected void Page_Load(object sender,EventArgs e)
{
    if (!Page.IsPostBack)
    {
        dtbl = new DataTable();
        dtbl.Columns.Add("id");
        dtbl.Columns.Add("name");
        for (int i = 0; i < 10; i++)
        {
            DataRow dr = dtbl.NewRow();
            dr["id"] = i.ToString();
            dr["name"] = i + 1;
            dtbl.Rows.Add(dr);
        }
    }
}

索引页

protected void Page_Load(object sender,EventArgs e)
{
    if (!Page.IsPostBack)
    {
        home.dtbl = new DataTable();
    }
}

现在在每个页面中放置一个断点并运行应用程序,

>在单独的选项卡中打开这两个页面.
>刷新主页并检查列是否显示
>现在转到下一个选项卡(索引)并刷新它(为dt创建一个新的实例).它将影响datatable,现在你也可以在家里得到新的datatable.
所以如果这两个进程/页面同时被执行,那么这两个页面将获得最新的值.这就是为什么我会在并发测试中认识到这一点.

You can make use of a session in this case. Consider the following code:

protected void Page_Load(object sender,EventArgs e)
{
    if (!Page.IsPostBack)
    {
        dtbl = new DataTable();
        dtbl.Columns.Add("id");
        dtbl.Columns.Add("name");
        for (int i = 0; i < 10; i++)
        {
            DataRow dr = dtbl.NewRow();
            dr["id"] = i.ToString();
            dr["name"] = i + 1;
            dtbl.Rows.Add(dr);
        }
        if (((DataTable)Session["MyDatatable"]).Columns.Count < 0)
        {
            Session["MyDatatable"] = dtbl;
        }
        else
        {
            dtbl = (DataTable)Session["MyDatatable"];
        }
    }
}

猜你在找的C#相关文章