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

本文关键字:绑定 网格 视图 WebMethod 静态 | 更新日期: 2023-09-27 17:56:50

我使用静态 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];
        }

并收到错误" 非静态字段、方法或属性需要对象引用"

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

你不能做你想做的事。

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

那么,您的静态方法如何决定要服务哪一个呢?不能。

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

阅读以下文章以了解更多信息 为什么 WebMethod 是静态的。

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

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

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

您可以将网格视图的reference传递给static method并绑定 girdview。

如果创建classnew实例并调用静态方法,它将create new form并且all controlscreatedspecific instance,因此永远不会填充original form上的gridview

下面是如何传递引用和绑定网格视图的示例。

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();
  }
}

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

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

您有 2 个选项
删除WebMethod并让它回发,或者通过表,TR,TD

从jQuery创建网格视图我怎么不知道 GridView 传入 Web 方法的参数,您也可以检查它,但我认为您只能阅读它(如果可能),无法绑定

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

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

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

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

关于你的JQuery ajax调用,你必须手动处理它,也许使用像KNOCKOUT这样的库,或者你可以用一个隐藏的按钮替换你当前的jquery ajax调用,在那里你可以放置你的当前代码,把你的网格视图和这个按钮放在一个UpdatePanel中,并进行部分更新

你可以

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

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。