Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从静态WebMethod绑定gridview_C#_Asp.net_.net_Datagridview_Static Methods - Fatal编程技术网

C# 如何从静态WebMethod绑定gridview

C# 如何从静态WebMethod绑定gridview,c#,asp.net,.net,datagridview,static-methods,C#,Asp.net,.net,Datagridview,Static Methods,我使用jQuery调用了一个代码隐藏方法,该方法使用静态web方法。那个web方法调用是成功的,但当我在该方法中绑定网格视图时,给出了一个错误,我们不能在静态方法中使用控件。我们如何解决这个问题 public static DataTable GetDataTable() { DataSet ds = new DataSet(); SqlCommand cmd = new SqlCommand("StoredPr

我使用jQuery调用了一个代码隐藏方法,该方法使用静态web方法。那个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];

        }

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

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

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

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

您可以将gridview的
引用
传递到
静态方法
并绑定girdview

如果创建
类的
新实例
并调用静态方法,它将
创建新表单
将为该
特定实例
创建所有控件
,因此将永远不会填充
原始表单
上的
网格视图

下面是一个如何传递引用和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发回数据,请参见一个示例


阅读以下文章了解更多信息

问题不在于静态关键字, 它与web方法关键字一起使用,
当asp.net控件发回时,
它在服务器上采用了整个表单,因此表单可以获得服务器的每个控件。

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

你有两个选择
删除webmethod并让它发回,或者通过表tr、td从jquery创建gridview

尽管我不知道gridview如何传入web方法的参数,但您也可以检查它,但我认为您只能阅读它(如果可能),绑定是不可能的

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

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

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

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


对于JQuery ajax调用,必须手动处理,可能使用类似于库的knockout,或者您可以将当前的jquery ajax调用替换为一个隐藏按钮,您可以将当前代码、gridview和该按钮放在更新面板中,并执行部分更新

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

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;
    }
公共静态数据表GridData(字符串para1,字符串para2)
{
使用(SqlConnection con=newsqlconnection(strconn))
{
使用(SqlCommand cmd=new SqlCommand())
{
con.Open();
cmd.CommandText=“SP_Name”;
cmd.CommandType=CommandType.storedProcess;
cmd.Parameters.AddWithValue(“@para1”,para1);
cmd.Parameters.AddWithValue(“@para2”,para2);
cmd.Connection=con;
SqlDataAdapter da=新的SqlDataAdapter(cmd);
DataTable dt=新的DataTable();
da.填充(dt);
con.Close();
返回dt;
}
}
}
[网络方法]
公共静态列表BindGridData(字符串para1,字符串para2)
{
DataTable dt=ClassName.GridData(para1,para2);
列表=新列表();
foreach(数据行dr在dt.行中)
{
ClassName pa=新的ClassName();
pa.para1=Convert.ToString(dr[“para1”]);
pa.para2=转换为字符串(dr[“para2”]);
列表。添加(pa);
}
退货清单;
}

并将此web方法绑定到j query和Ajax。

Just
gridToBind.DataSource=ds
?不要将
DateTime
值存储为字符。它不起作用。好的,我将更改字符串参数。我的重点是只绑定gridview。这将创建
表单的
新实例
,并填充
新实例的
gridview
。这不会填充
原始表单上的
GridView
,因此这不是正确的方法。我在webmethod中调用公共静态DataTable GetDataTable()方法。。不是从page_load开始的。您的答案上需要做哪些更改。在ajax成功的情况下,您需要返回数据并创建html。这意味着100个使用该网站的用户将使用相同的静态webmethod实例。我是对的?那么网站性能是否会受到影响?Ac