【问题标题】:Update Gridview using OnClick Event使用 OnClick 事件更新 Gridview
【发布时间】:2026-02-15 20:45:02
【问题描述】:

我正在开发一个基本的 Web 表单,它允许用户搜索数据库中的某些列并在 GridView 中显示这些记录。我有几个 TextBox 控件允许用户搜索名称、ID 等。我将 LinqToSql 用于我的数据访问层。这是您的基本搜索表单。

问题来自我尝试使用的 GridView 显示数据。我在 Button 控件的 OnClick 事件方法中有查询本身。

protected void SearchSpecific_Click(object sender, EventArgs e)
    {
    MyDataContext dbContext = new MyDataContext();
    var results = from row in dbContext.MyTable
                  select row;

    if(TextBoxIsValid(IDNumber))
        results = results.Where(m => m.ID == Int32.Parse(IDNumber.Text));

    if (validationFlag)
    {
        // this part doesn't seem right
        SearchResultDataset.DataSource = results;
        SearchResultDataset.DataBind();
    }
}

这里是网格视图,虽然没什么特别的:

<asp:GridView ID="SearchResultDataset" runat="server"
    AlternatingRowStyle-CssClass="alt"
    CssClass="search_results"
    GridLines="None"
    AutoGenerateColumns="true"></asp:GridView>

在我到达 DataBind() 方法并抛出 NullReferenceException 之前,一切都运行得很顺利。神圣的例外,蝙蝠侠!

调试器告诉我结果具有正确的值,但我感觉它与回发时绑定数据源有关。我觉得我错过了什么......有什么建议吗?如有必要,我可以提供堆栈跟踪。

编辑:

手头有一个更大的问题。我尝试将 LinqDataSource 和 ObjectDataSource 控件都添加到我的页面,并且都抛出 NullReferenceException。我使用 GUI 构建了两者,它们看起来很完美。

之后,我在 Page_Load 方法中分配了一个 DataSource:

try
{
    MyDataContext dbc = new MyDataContext();
    SearchResultDataset.DataSource = dbc.MyTable;
    SearchResultDataset.DataBind();
}
catch (Exception ex)
{
    errText.InnerHtml = ex.ToString();
}

想出了这个例外:

System.Reflection.TargetInvocationException: Property accessor 'IsPostBack' on object 'MySite.MySite' threw the following exception:'Object reference not set to an instance of an object.' ---> System.NullReferenceException: Object reference not set to an instance of an object.

在 System.Web.UI.UserControl.get_IsPostBack()

异常肯定是在 DataBind() 方法中引发的。这就提出了WTF正在发生的问题?我似乎无法将 linqtosql 源绑定到我的 GridView。我似乎找不到该页面,但我在某处读到 GridView 难以绑定到任何不是 DataSet 对象的东西。

更新

使用SqlDataSource控件访问数据库。

【问题讨论】:

  • 为什么要删除您的帖子?它不是那样工作的。当您在此处发布问题时,您将根据 cc:wiki 许可将其许可给社区。在发帖之前考虑一下这个

标签: c# asp.net linq-to-sql


【解决方案1】:

您的问题似乎是您试图将数据视图绑定到匿名类型。正如 MSDN 所说:

从查询创建 DataView 返回匿名类型不是 支持。

解决方案:使用 .ToList() 函数将该 var 转换为数据视图可以理解并可以使用的数据类型。

像这样:

SearchResultDataset.DataSource = results.ToList();

【讨论】:

  • Bump 用于指出错误,但这并不能解决 NullReference。更奇怪的是,我添加了一个 LinqDataSource 来不加选择地填充表并引发 NullReferenceException。但是,我知道我可以访问数据库,因为我用同一个表中的数据填充了其他控件。如此奇怪,令人沮丧的问题。
  • 我还必须在数据绑定控件中设置 nulldisplaytext 属性。