我正在开发一个基本的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控件访问数据库。
答案 0 :(得分:1)
您的问题似乎是您尝试将数据视图绑定到匿名类型。正如MSDN所说:
从查询中创建DataView 返回匿名类型不是 支撑。
解决方案:使用.ToList()函数将该变量转换为数据视图理解并可以使用的数据类型。
像这样:
SearchResultDataset.DataSource = results.ToList();