如何从静态WebMethod绑定gridview

时间:2015-06-18 09:28:46

标签: c# asp.net .net datagridview static-methods

我使用静态Web方法使用jQuery调用了一个代码隐藏方法。那个web方法调用是成功的,但是当我在该方法中绑定网格视图时会产生一个错误,该错误无法在静态方法中使用控件。我们可以解决这个问题。

  public static DataTable GetDataTable()
        {
            DataSet ds = new DataSet();        
            SqlCommand cmd = new SqlCommand("StoredProcedurename");
            String constr = ConfigurationManager.ConnectionStrings["DBConnection"].ConnectionString;
            SqlConnection con = new SqlConnection(constr);


            string Startdate = DateTime.Now.ToString("yyyy-MM-dd");
            string EndDate = Convert.ToDateTime(Startdate).AddMonths(-6).ToString("yyyy-MM-dd");
            cmd.CommandType = CommandType.StoredProcedure;      
            cmd.Parameters.AddWithValue("@FromDate", Startdate);
            cmd.Parameters.AddWithValue("@ToDate", EndDate );
            cmd.Connection = con;
            SqlDataAdapter sda = new SqlDataAdapter(cmd);       

            sda.Fill(ds);

            //i want to use same dataset to bind with the grid
            gridToBind.DataSource = ds.Tables[1];
            gridToBind.DataBind();
            txtStatus.Text="Data Received";
           //above three lines throws error.

          return ds.Tables[1];

        }

获取错误“非静态字段,方法或属性需要对象引用”

6 个答案:

答案 0 :(得分:9)

你无法做你想做的事。

你误解了静态和实例之间的区别。例如,您的页面可以被数百个不同的人使用。每个人都将为您的页面提供不同的实例,每个人都会看到不同的GridView实例。另一方面,由于您的WebMethod是静态的,所以这些数百个不同的人将被提供一种方法。

那么你的静态方法如何决定服务哪个?它不能。

如果要从ajax填充网格视图,则需要从WebMethod发回数据,请参阅一个示例here

阅读以下文章,了解更多Why WebMethod are static

答案 1 :(得分:3)

如果您要使用静态方法,那么您将无法使用任何页面控件,因为它们属于没有静态范围的页面类。在静态方法中,您只能使用静态数据,控制等。 可能的解决方案是您必须在静态方法中创建父类的新实例,即Page Class,然后您可以访问该实例页面的所有控件。 喜欢这个..

public static <ReturnType> MethodName
{
Class instance=new Class();
instance.GridView.DataSource=ds;
instance.GridView.DataBind();
}

但如果想要保留数据,则给定的方式不起作用,因为instnace将是新的,因此将刷新旧数据。

答案 2 :(得分:2)

您可以将<IfModule mod_rewrite.c> SetEnv HTTP_MOD_REWRITE On RewriteEngine on RewriteBase / RewriteCond %{REQUEST_URI} ([^.]+).html$ RewriteRule ^.* %1.php [L] </IfModule> gridview传递给reference并绑定girdview。

如果你制作了static method的{​​{1}}个实例并调用静态方法,则newclass将为create new form all controls因此永远不会填充created上的specific instance

以下是如何传递reference和bindgridview的示例。

gridview

答案 3 :(得分:2)

问题不在于static关键字, 它是用web方法关键字,
当asp.net控制帖子支持时,它在服务器上采取整体形式,因此表单可以获得服务器的每个控件。

虽然web方法只有你传递参数的数据,但它甚至不知道你的asp页面中可用的控件名称

你有2个选择
要么删除webmethod并让它回发或通过table,tr,td从jquery创建你的gridview 我怎么不知道gridview传递web方法的参数,你也可以检查它,但我认为你只能读它(如果可能的话),绑定是不可能的

答案 4 :(得分:1)

你遇到的问题与asp.net webforms如何将数据绑定到它的控件有关。

当您处于正常的回发并且使用某些数据填充gridview数据源时,此数据将“记录”在gridview视图状态中,然后在浏览器中呈现为名为_VIEWSTATE的隐藏字段,这就是您遇到的问题所在

当您执行ajax调用并调用(静态)Web方法时,您的服务器控件不存在,因为您没有完整的页面循环。

您可以做的是将数据源保存在会话中以供以后处理。

关于你的JQuery ajax调用,你必须手动处理它,也许使用类似淘汰的库,或者你可以替换你当前的jquery ajax调用一个隐藏的按钮,你可以把你当前的代码放到gridview和这个按钮在 UpdatePanel 内进行部分更新

答案 5 :(得分:1)

您可以这样做,从静态方法返回数据表。

public static DataTable GridData(string para1, string para2)
    {

        using (SqlConnection con = new SqlConnection(strconn))
        {
            using (SqlCommand cmd = new SqlCommand())
            {
                con.Open();
                cmd.CommandText = "SP_Name";
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@para1", para1);
                cmd.Parameters.AddWithValue("@para2", para2);
                cmd.Connection=con;
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                DataTable dt = new DataTable();
                da.Fill(dt);
                con.Close();
                return dt;
            }
        }
    }

 [WebMethod]
    public static List<ClassName> BindGridData(string para1,string para2)
    {
        DataTable dt = ClassName.GridData(para1, para2);
        List<ClassName> list = new List<ClassName>();
        foreach (DataRow dr in dt.Rows)
        {
            ClassName pa = new ClassName();
            pa.para1 = Convert.ToString(dr["para1"]);
            pa.para2 = Convert.ToString(dr["para2"]);
            list.Add(pa);
        }
        return list;
    }

将此Web方法绑定到j query和Ajax。