C# 从代码隐藏填充GridView

C# 从代码隐藏填充GridView,c#,asp.net,webforms,C#,Asp.net,Webforms,我有以下代码: [WebMethod] public static string GenerateHtml(string id) { //return id; DataView vwMain2; try { DbProviderFactory dbf = DbProviderFactories.GetFactory(); using (IDbConnection con = dbf.CreateConnection())

我有以下代码:

[WebMethod]
public static string GenerateHtml(string id)
{
    //return id;
    DataView vwMain2;
    try
    {
        DbProviderFactory dbf = DbProviderFactories.GetFactory();
        using (IDbConnection con = dbf.CreateConnection())
        {
            string sSQL;
            sSQL = "select top 20                " + ControlChars.CrLf
                 + " ASSISTING_FILE_ID, DATE_ENTERED, CLIENT_CLAIM_NUM, PRIMARY_INSURED, PRIMARY_CLAIMANT, LOB_ID, FILE_STATUS, BRANCH_NAME," + ControlChars.CrLf
                 + " OWNERS_FIRST_NAME, OWNERS_LAST_NAME, OWNERS_NAME, OWNERS_EMAIL, OWNERS_OFFICE_PHONE, OWNERS_FAX_PHONE, OWNERS_CELL_PHONE" + ControlChars.CrLf
                 + "  from vwFILES_DetailViewWithOwners" + ControlChars.CrLf
                 + " where 1 = 1                    " + ControlChars.CrLf;
            //+ " where 1 = 1 and WEB_USER_ID = '" + Security.USER_ID.ToString() + "'" + ControlChars.CrLf;
            using (IDbCommand cmd = con.CreateCommand())
            {
                cmd.CommandText = sSQL;

                using (DbDataAdapter da = dbf.CreateDataAdapter())
                {
                    ((IDbDataAdapter)da).SelectCommand = cmd;
                    using (DataTable dt = new DataTable())
                    {
                        da.Fill(dt);
                        vwMain2 = dt.DefaultView;
                        GridView2.DataSource = vwMain2;

                            GridView2.DataBind();

                    }
                }
            }
        }
    }
    catch (Exception ex)
    {
        SplendidError.SystemError(new StackTrace(true).GetFrame(0), ex.Message);
        //lblError.Text = ex.Message;
    }

}
我的ASPX页面中有以下内容:

<asp:GridView ID="GridView2" runat="server">
                </asp:GridView>

当我尝试在我的代码隐藏中引用
GridView2
时,它会说,“非静态字段、方法或属性GridView2需要对象引用。”


如何解决此问题,以便在调用
GenerateHtml
时创建网格视图,或者有更好的方法吗?

在调用WebMethod时,您将不会引用任何页面元素。记住,您正在调用一个静态方法。要访问隐藏代码中的任何页面级元素,您必须经历.NET页面生命周期,在那里所有的“魔法”都会发生


看看这个SO问题,了解如何做您想要做的事情:

哪一行抛出了这个错误?它是在您尝试将视图分配给数据源时发生的,还是在您调用DataBind时发生的?作为一般性的注释。确保使用Sql参数,而不是直接将字符串输入到Sql语句中。否则,可能有人会执行“where 1=1”,sql inject会攻击您的数据库。@dave823它发生在对
GridView2
的两个引用上。好的,谢谢。“GenerateHtml”方法是静态的有什么原因吗?您是从codebehind page_load或某个按钮单击事件调用此方法,还是正在调用的自定义类?如果此方法不直接在页面代码中,则必须将GridView对象作为参数传入。很抱歉,我没有意识到这是一个web方法。我猜您正在使用javascript/ajax调用此方法。我认为不可能以这种方式绑定到GridView之类的控件。您可以将数据返回到屏幕,但不能在GridView中。另一张海报贴出了一个很好的链接,其中包含了本系列中GridView替代方案的想法。因此,我查看了该链接(以及其中的链接),似乎无法通过Web方法更新网格?它向我展示了如何使用jqGrid进行更新,但是ASP.NET中的GridView没有。该页面上有很多示例,以及从那里链接的所有后续页面。很多我非常怀疑你在做出回应的那一分钟内就把所有这些都看完了。也就是说,我知道使用GridView和AJAX-ish功能的唯一方法是使用UpdatePanel。我可能没有全部看过,但我也读到UpdatePanel可能是实现这一点的唯一方法。。。但我不确定我是否想用它,我百分之百同意。我个人不太喜欢UpdatePanel。然而,如何做到这一点的问题已被多次回答。答案就在那里;)