如何从静态 WebMethod 绑定 gridview

How to Bind a gridview from a static WebMethod

我使用 jQuery 使用静态 web 方法调用了代码隐藏方法。该 web 方法调用成功,但是当我在该方法中绑定网格视图时,出现错误,我们不能在静态中使用控件 method.how 我们可以解决这个问题吗?

  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];

        }

并出现错误“非静态字段、方法或 属性 需要对象引用”

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

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

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

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

如果您创建 classnew 实例并调用静态方法,它将 create new formall controls 将是 created specific instance 所以 original form 上的 gridview 将永远不会被填充。

这是一个如何传递引用和 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();
  }
}

你不能为所欲为。

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

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

如果您想从 ajax 填充网格视图,您需要从您的 WebMethod 发回数据,参见一个示例 here

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

问题不在于 static 关键字, 它与网络方法关键字,
当 asp.net 控制 post 后退时,
它在服务器上占据了整个表单,因此表单可以获取服务器的每个控件。

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

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

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

当您在正常回发中并使用一些数据填充 gridview 数据源时,此数据在 gridview viewstate 中 "recorded" 然后在浏览器中呈现在名为 _VIEWSTATE 的隐藏字段中,这是你的问题在哪里。

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

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

关于您的 JQuery ajax 调用,您必须手动处理它,也许使用像 knockout 这样的库,或者您可以替换当前的 jquery ajax 调用对于隐藏按钮,您可以在其中放置当前代码并将 gridview 和此按钮放入 UpdatePanel 并执行 partial update.

你可以这样做,Return来自静态方法的数据表。

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。