如何从静态WebMethod绑定网格视图

问题描述 投票:9回答:6

我使用静态网络方法使用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];

        }

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

c# asp.net .net datagridview static-methods
6个回答
11
投票

您无法做您想做的。

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

然后,您的静态方法如何确定要使用哪种方法?不行

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

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


3
投票

如果要使用静态方法,则将无法使用page的任何控件,因为它们属于没有静态作用域的页面的类。在静态方法中,只允许使用静态数据,控件等。可能的解决方案是您将必须为您的父类创建一个新实例,即以静态方法创建Page Class,然后您可以访问该实例对页面的所有控件。像这样..

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

但是如果要保留数据,给定的方法将不起作用,因为实例将是新的,因此将刷新旧数据。


2
投票

您可以将gridview的reference传递到static method并绑定girdview。

[如果创建newclass实例并调用静态方法,则该create new form的将为all controls,而created将为specific instance,因此gridview上的original form将永远不会被填充。

这里是一个如何传递引用和bindgridview的示例。

protected void Page_Load(object sender, EventArgs e)
{
   GridView grd = grdTest; //grdTest is Id of gridview
   BindGrid(grd);

}
public static void BindGrid(GridView grd)
{
  using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString))
  {
    SqlCommand cmd = new SqlCommand("select* from testtable", con);
    SqlDataAdapter adapter = new SqlDataAdapter(cmd);
    DataTable dt = new DataTable();
    adapter.Fill(dt);
    grd.DataSource = dt;
    grd.DataBind();
  }
}

2
投票

问题不在于静态关键字,它与网络方法关键字有关当asp.net控件回发时,它占据了服务器上的整个表单,因此表单可以获取您服务器的每个控件。

虽然Web方法仅具有您通过参数传递的数据,但它甚至不知道您的ASP页面中可用的控件的名称

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


1
投票

您遇到的问题与asp.net Webforms如何将数据绑定到其控件有关。

[处于正常的回发状态,并用一些数据填充了gridview数据源时,此数据被“记录”在gridview的viewstate中,然后在浏览器中呈现为一个名为_VIEWSTATE的隐藏字段中,这就是问题所在。

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

您可以做的是将数据源保存在Session中,以备后用。

关于您的JQuery ajax调用,您必须手动处理它,也许使用像敲除之类的库,或者您可以将当前的jquery ajax调用替换为一个隐藏按钮,在该按钮中您可以放置​​当前代码,并将gridview和该按钮放入UpdatePanel并执行部分更新


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查询和Ajax。

© www.soinside.com 2019 - 2024. All rights reserved.