0

データセットに問題があります。フォームのテキスト ボックスに入力するために 1 つを使用しています。ユーザーが検索する値を選択し、ボタンを押すと、テキスト ボックスが入力されます。これは最初のレコードでは問題なく機能しますが、ページをめくってみたいと思います。他のメソッドで使用するデータ セットを宣言しましたが、返された行をページングすると、オブジェクト参照エラーが発生し続けます。誰かが私が間違っている場所に光を当てることができますか?

変数の宣言:

//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");
    }

}

これについて何か助けていただければ幸いです。正直なところ、データセットが最初はナビゲーション方法で機能するのに、2番目の方法では機能しない理由がわかりません。私はこのhttp://www.homeandlearn.co.uk/csharp/csharp_s12p7.htmlをガイドとして使用してきました。その例では、検索パラメーターが選択されたときに表示されるページの読み込みに関するデータが表示されます。これが問題かどうかはわかりませんが、もう少し情報があれば問題ありません。

4

1 に答える 1

1

Session/Cache/ ViewStateDataSetに永続化します (これらのいずれかが最も適切なソリューションです)。そうすればDataSet、ポストバックの間を取得して、必要なデータを表示し続けることができます。

これを実現する方法(単純な例ではありますが) と、asp.net 内のオブジェクトの永続化について詳しく説明している記事 ( asp.net オブジェクトの永続化) を次に示します。

于 2013-07-15T11:20:41.913 に答える