web-dev-qa-db-ja.com

静的Webメソッドからグリッドビューをバインドする方法

静的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];

        }

そして、「非静的フィールド、メソッド、またはプロパティにはオブジェクト参照が必要です」というエラーが発生します

9
Athul

やりたいことができない

静的とインスタンスの違いを誤解しています。たとえば、あなたのページは何百人もの異なる人によって使用される可能性があります。すべての人にページの異なるインスタンスが提供され、すべての人にGridViewの異なるインスタンスが表示されます。一方、WebMethodは静的であるため、これらの数百人のすべての人に1つのメソッドが提供されます。

では、静的メソッドはどのようにサービスを提供するかを決定できますか?それはできません。

Ajaxからグリッドビューにデータを入力する場合は、WebMethodからデータを送り返す必要があります。1つの例を参照してください ここ

詳細については、次の記事をお読みください WebMethodが静的である理由

9
Atilla Ozgur

静的メソッドを使用する場合、静的スコープを持たないページのクラスに属しているため、ページのコントロールを使用することはできません。静的メソッドでは、静的データ、コントロールなどの使用のみが許可されます。考えられる解決策は、親クラスの新しいインスタンス、つまり静的メソッドのページクラスを作成する必要があり、その後、そのインスタンスのページのすべてのコントロールにアクセスできるようにすることです。このような..

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

ただし、データを保持したい場合は、インスタンスが新しくなり、古いデータがフラッシュされるため、指定された方法は機能しません。

3
hdkhardik

問題は静的キーワードではなく、Webメソッドキーワードにあります。
asp.netコントロールがポストバックすると、
サーバー上でフォーム全体を取得したため、フォームはサーバーの各制御を取得できます。

webメソッドには、パラメーターを介して渡すデータのみが含まれますが、ASPページで使用可能なコントロールの名前すらわかりません。

2つのオプションがあります
webmethodを削除して、ポストバックさせるか、
テーブル、tr、tdによってjqueryからグリッドビューを作成します
webメソッドのパラメーターを渡すgridviewについては知らないのですが、チェックすることもできますが、(可能であれば)読み取りのみが可能で、バインドはできません。

2
VISHMAY

Gridviewのreferencestatic methodに渡して、girdviewをバインドできます。

newclassインスタンスを作成し、静的メソッドを呼び出すと、create new formになり、all controlsはそのspecific instanceに対してcreatedになるため、original formgridviewになります。移入されることはありません。

これは、参照と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();
  }
}
2
Mairaj Ahmad

あなたが抱えている問題は、asp.netwebformsがそのコントロールにデータをバインドする方法に関連しています。

通常のポストバックにいて、gridviewデータソースにデータを入力すると、このデータはgridviewビューステートに「記録」され、ブラウザの_VIEWSTATEという名前の非表示フィールドにレンダリングされます。これが問題の原因です。

Ajax呼び出しを実行し、(静的)Webメソッドを呼び出すと、ページサイクル全体がないため、サーバーコントロールは存在しません。

できることは、後で処理できるようにデータソースをセッションに保存することです。

JQuery ajax呼び出しに関連して、手動で処理する必要があります。おそらく、ノックアウトなどのライブラリを使用するか、現在のjquery ajax呼び出しを、現在のコードを配置してグリッドビューとこのボタンを-内に配置する非表示ボタンに置​​き換えることができます。 pdatePanelそして部分更新を実行します。

1
Coastpear

あなたはこの方法を行うことができます、静的メソッドからデータテーブルを返します。

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メソッドをjqueryとAjaxにバインドします。

1