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的
如果您对
下面是一个如何传递引用和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和此按钮放在更新面板中,然后进行部分更新。