数据集未正确引用

时间:2013-07-15 11:05:42

标签: c# asp.net

我遇到了数据集问题。我正在使用一个填充表单的文本框。用户选择要搜索的值,按下按钮然后填充文本框。这适用于第一个记录,但我想翻阅它们。我已经声明了一个数据集供我的其他方法使用但是当它分页返回的行时,我一直得到一个Object引用错误。任何人都可以解释我出错的地方吗?

声明变量:

//creates a global dataset for the copies table
DataSet dataSetHM;
//create default row values
int MaxRows = 0;
int inc = 0;

与数据库的连接并填充数据集:

protected void ExecuteSelectCopies(string sName)
{
    SqlConnection connection = new SqlConnection(GetConnectionString());
    string sql =
        "SELECT tblCopies.CopyID, tblSoftware.SoftwareName, tblCopies.AssetName, tblCopies.Location,"
        + " tblCopies.LicenceKey, tblCopies.OEM, tblCopies.State, tblCopies.InstallationDate"
        + " FROM tblCopies"
        + " INNER JOIN tblSoftware ON tblCopies.SoftwareID = tblSoftware.SoftwareID"
        + " WHERE tblSoftware.SoftwareName = @SoftwareName"
        + " ORDER BY tblCopies.CopyID";
    SqlDataAdapter adapterHM = new SqlDataAdapter();
    SqlCommand select = new SqlCommand(sql, connectionHM);
    adapter.SelectCommand = select;
    select.Parameters.Add(new SqlParameter("@SoftwareName", sName));
    //open the connection
    connectionHM.Open();
    dataSetHM =  new DataSet();
    adapterHM.Fill(dataSetHM, "Copies");
    NavigateCopies();
    MaxRows = dataSetHM.Tables["Copies"].Rows.Count;

    connectionHM.Close();
}

填写文本框的方法:

    private void NavigateCopies()
{
    DataRow dRow = dataSetHM.Tables["Copies"].Rows[inc];
    TextBoxCopyID.Text = dRow.ItemArray.GetValue(0).ToString();
    TextBoxSoftwareName.Text = dRow.ItemArray.GetValue(1).ToString();
    DropDownListAssetName.SelectedItem.Text = dRow.ItemArray.GetValue(2).ToString();
    DropDownListLocation.SelectedItem.Text = dRow.ItemArray.GetValue(3).ToString();
    TextBoxLicence.Text = dRow.ItemArray.GetValue(4).ToString();
    DropDownListType.SelectedItem.Text = dRow.ItemArray.GetValue(5).ToString();
    DropDownListState.SelectedItem.Text = dRow.ItemArray.GetValue(6).ToString();
    TextBoxInstall.Text = dRow.ItemArray.GetValue(7).ToString();    
}

最后是下一条记录的按钮:

    protected void ButtonNext_Click(object sender, EventArgs e)
{
    if (inc != MaxRows - 1)
    {
        inc++;
        NavigateCopies();
    }
    else
    {
        MessageBox.show("No more Rows");
    }

}

非常感谢任何帮助。老实说,我无法理解为什么数据集最初适用于导航方法但不适用于第二种。我一直在使用这个http://www.homeandlearn.co.uk/csharp/csharp_s12p7.html作为指南,他们的示例显示了页面加载时的数据,当选择搜索参数时显示我的数据。我不知道这是一个问题,但更多的信息永远不会伤害!

1 个答案:

答案 0 :(得分:1)

在会话/缓存/ ViewState中保留DataSet(其中任何一个都是最适合您的解决方案)。 这样您就可以在回发之间检索DataSet并继续显示所需的数据。

Here is how to accomplish this(虽然是一个简单的例子)和一篇深入研究asp.net中对象持久性的文章:asp.net object persistence.