静的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];
}
そして、「非静的フィールド、メソッド、またはプロパティにはオブジェクト参照が必要です」というエラーが発生します
やりたいことができない
静的とインスタンスの違いを誤解しています。たとえば、あなたのページは何百人もの異なる人によって使用される可能性があります。すべての人にページの異なるインスタンスが提供され、すべての人にGridViewの異なるインスタンスが表示されます。一方、WebMethodは静的であるため、これらの数百人のすべての人に1つのメソッドが提供されます。
では、静的メソッドはどのようにサービスを提供するかを決定できますか?それはできません。
Ajaxからグリッドビューにデータを入力する場合は、WebMethodからデータを送り返す必要があります。1つの例を参照してください ここ 。
詳細については、次の記事をお読みください WebMethodが静的である理由 。
静的メソッドを使用する場合、静的スコープを持たないページのクラスに属しているため、ページのコントロールを使用することはできません。静的メソッドでは、静的データ、コントロールなどの使用のみが許可されます。考えられる解決策は、親クラスの新しいインスタンス、つまり静的メソッドのページクラスを作成する必要があり、その後、そのインスタンスのページのすべてのコントロールにアクセスできるようにすることです。このような..
public static <ReturnType> MethodName
{
Class instance=new Class();
instance.GridView.DataSource=ds;
instance.GridView.DataBind();
}
ただし、データを保持したい場合は、インスタンスが新しくなり、古いデータがフラッシュされるため、指定された方法は機能しません。
問題は静的キーワードではなく、Webメソッドキーワードにあります。
asp.netコントロールがポストバックすると、
サーバー上でフォーム全体を取得したため、フォームはサーバーの各制御を取得できます。
webメソッドには、パラメーターを介して渡すデータのみが含まれますが、ASPページで使用可能なコントロールの名前すらわかりません。
2つのオプションがあります
webmethodを削除して、ポストバックさせるか、
テーブル、tr、tdによってjqueryからグリッドビューを作成します
webメソッドのパラメーターを渡すgridviewについては知らないのですが、チェックすることもできますが、(可能であれば)読み取りのみが可能で、バインドはできません。
Gridviewのreference
をstatic method
に渡して、girdviewをバインドできます。
new
のclass
インスタンスを作成し、静的メソッドを呼び出すと、create new form
になり、all controls
はそのspecific instance
に対してcreated
になるため、original form
のgridview
になります。移入されることはありません。
これは、参照と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();
}
}
あなたが抱えている問題は、asp.netwebformsがそのコントロールにデータをバインドする方法に関連しています。
通常のポストバックにいて、gridviewデータソースにデータを入力すると、このデータはgridviewビューステートに「記録」され、ブラウザの_VIEWSTATEという名前の非表示フィールドにレンダリングされます。これが問題の原因です。
Ajax呼び出しを実行し、(静的)Webメソッドを呼び出すと、ページサイクル全体がないため、サーバーコントロールは存在しません。
できることは、後で処理できるようにデータソースをセッションに保存することです。
JQuery ajax呼び出しに関連して、手動で処理する必要があります。おそらく、ノックアウトなどのライブラリを使用するか、現在のjquery ajax呼び出しを、現在のコードを配置してグリッドビューとこのボタンを-内に配置する非表示ボタンに置き換えることができます。 pdatePanelそして部分更新を実行します。
あなたはこの方法を行うことができます、静的メソッドからデータテーブルを返します。
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にバインドします。