关于C#:如何从静态WebMethod绑定GridView

How to Bind a gridview from a static WebMethod

我使用jquery使用静态web方法调用了代码隐藏方法。那个Web方法调用是成功的,但当我在该方法内部绑定网格视图时,会出现一个错误,不能在静态方法中使用控件。我们如何解决这个问题。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
  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];

        }

以及获取错误"非静态字段、方法或属性需要对象引用"


你不能随心所欲。

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

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

如果您想从Ajax填充网格视图,您需要从WebMethod发送回数据,请参见这里的一个示例。

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


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

1
2
3
4
5
6
public static <ReturnType> MethodName
{
Class instance=new Class();
instance.GridView.DataSource=ds;
instance.GridView.DataBind();
}

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


问题不在于静态关键字,它带有web方法关键字,
当ASP.NET控件回发时,
它在服务器上采用了整个窗体,因此窗体可以获取服务器的每个控件。

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

你有两个选择
删除webmethod并让它回发,或者从jquery中创建您的gridview by table,tr,td
我怎么会不知道GridView传入Web方法的参数,你也可以检查它,但我认为你只能读取它(如果可能),绑定是不可能的


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

如果您对class进行new实例并调用静态方法,它将为create new form,而all controls将为该specific instancecreated,因此original form上的gridview将永远不会被填充。

下面是一个如何传递引用和bindgridview的示例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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();
  }
}


您可以这样做,从静态方法返回DataTable。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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。


您遇到的问题与ASP.NET WebForms如何将数据绑定到控件相关。

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

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

您可以在会话中保存数据源,以便以后处理。

对于jquery ajax调用,您必须手动处理它,可能使用类似于knockout的库,或者您可以用隐藏按钮替换当前的jquery ajax调用,您可以将当前代码放在其中,并将GridView和此按钮放在更新面板中,然后进行部分更新。