【问题标题】:How to Bind a gridview from a static WebMethod如何从静态 WebMethod 绑定网格视图
【发布时间】:2015-06-18 09:28:45
【问题描述】:

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

        }

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

【问题讨论】:

  • 只是gridToBind.DataSource = ds?并且不要将您的 DateTime 值存储为字符。
  • 它不工作。好的,我将更改该字符串参数。我的注意力是只绑定gridview..

标签: c# asp.net .net datagridview static-methods


【解决方案1】:

你不能为所欲为。

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

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

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

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

【讨论】:

  • 这意味着使用该站点的 100 个用户将使用相同的静态 webmethod 实例。我是正确的?那么站点性能是否会受到影响?
  • 实际上性能会好一点,因为不需要创建 100 个实例。但这只是一点点。
  • 这个网络方法是如何工作的?第一个请求过程然后是第二个或同时?
  • 同时处理,因此静态方法可能存在同步问题。请参阅此处为什么通常应该避免在 Asp.Net 中使用静态方法 stackoverflow.com/questions/194999/…
【解决方案2】:

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

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

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

【讨论】:

  • 这将填充formnew instancenew instancegridview。这不会填充original form 上的GridView,因此这不是正确的方法。
【解决方案3】:

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

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

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

【讨论】:

  • 我在 webmethod 中调用公共静态 DataTable GetDataTable() 方法。不是来自 page_load。你的答案需要进行哪些更改。
  • 比你需要返回数据并在ajax成功创建html。
【解决方案4】:

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

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

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

【讨论】:

    【解决方案5】:

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

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

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

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

    关于您的 JQuery ajax 调用,您必须手动处理它,可能使用诸如敲除之类的库,或者您可以将当前的 jquery ajax 调用替换为隐藏按钮,您可以在其中放置当前代码并放置您的 gridview 和此按钮在 UpdatePanel 中进行部分更新

    【讨论】:

      【解决方案6】:

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

      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。

      【讨论】:

        猜你喜欢
        • 2015-12-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-01
        • 2016-03-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多