【问题标题】:Populate GridView from CodeBehind从 CodeBehind 填充 GridView
【发布时间】:2013-01-27 01:57:19
【问题描述】:

我有以下代码:

[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 时创建网格视图,或者有更好的方法吗?

【问题讨论】:

  • 哪一行抛出该错误?是在尝试将视图分配给数据源时发生,还是在调用 DataBind 时发生?
  • 作为一般说明。确保使用 Sql 参数而不是直接将字符串输入到 sql 语句中。否则有人可能会执行“where 1 =1”,然后 sql-inject 攻击您的数据库。
  • @dave823 它发生在对GridView2 的两个引用中。
  • 好的,谢谢。您的“GenerateHtml”方法是静态的有什么原因吗?您是从代码隐藏 page_load 或某些按钮单击事件中调用此方法,还是您正在调用的自定义类?如果此方法不直接在页面代码隐藏中,则必须将 GridView 对象作为参数传入
  • 很抱歉,我没有意识到这是一种网络方法。我猜你正在用 javascript/ajax 调用这个方法。我认为不可能以这种方式绑定到诸如 GridView 之类的控件。您可以将数据返回到屏幕,但不能在 GridView 中。另一张海报发布了一个很好的链接,其中包含在这个 senario 中替代 GridView 的想法。

标签: c# asp.net webforms


【解决方案1】:

在调用 WebMethod 时,您不会引用任何页面元素。请记住,您正在调用 static 方法。要访问代码隐藏中的任何页面级元素,您必须通过 .NET 页面生命周期,所有“魔法”都在此发生。

看看这个 SO 问题,了解如何做你想做的事:How to update an datagrid with webmethods

【讨论】:

  • 所以,我查看了链接(以及其中的链接),似乎无法通过 Web 方法更新网格?
  • 它向我展示了如何使用 jqGrid 做到这一点,而不是 ASP.NET 中的 GridView。
  • 该页面上有 很多 示例以及从该页面链接的所有后续页面。 很多。我非常怀疑您是否在您做出回应的那一刻就经历了所有这些。也就是说,我知道使用 GridView 并具有 AJAX-ish 功能的唯一方法是使用 UpdatePanel。
  • 我可能没有经历过所有这些,但我也读到 UpdatePanel 可能是这样做的唯一方法......不过我不确定我是否要使用它。
  • 我同意 100%。我个人不太喜欢 UpdatePanels。但是,如何做到这一点的问题已经在 SO 上回答了很多次。 答案就在那里 ;)
猜你喜欢
  • 1970-01-01
  • 2011-05-10
  • 1970-01-01
  • 2014-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-09
  • 1970-01-01
相关资源
最近更新 更多