使用OnClick事件更新Gridview

时间:2011-03-02 18:00:37

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

我正在开发一个基本的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();
    }
}

这是gridview,虽然没什么特别的:

<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控件访问数据库。

1 个答案:

答案 0 :(得分:1)

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

  

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

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

像这样:

SearchResultDataset.DataSource = results.ToList();