2017-11-09 5 views
-1

フォームに表示されているデータが検索ボタンで正常に機能しましたが、「前へ」および「次へ」リンクボタン「位置1に行がありません」というエラーが表示されます。ご協力いただきありがとうございエラークエリの次のデータセットにアクセスしようとすると「位置1に行がありません」C#

HTMLコード

<table class="auto-style1"> 
     <tr> 
      <td class="auto-style5"> 
    <asp:Label ID="Label1" runat="server" Text="Enter Patient Name"></asp:Label> 
      </td> 
      <td class="auto-style6"> 
       <asp:TextBox ID="txtSearchSurname" runat="server"></asp:TextBox> 
      </td> 
     </tr> 
     <tr> 
      <td class="auto-style2"> 
       <asp:Label ID="Label2" runat="server" Text="Enter Patient DOB"></asp:Label> 
      </td> 
      <td class="auto-style3"> 
       <asp:TextBox ID="txtSearchDOB" runat="server"></asp:TextBox> 
      </td> 
     </tr> 
    </table> 
    <br /> 
    <asp:Button ID="btnSearch" runat="server" Text="Search" Width="87px" OnClick="btnSearch_Click" /> 

フォームデータ

を表示する
<table class="auto-style1"> 
      <tr> 
       <td class="auto-style7">Hospital Number</td> 
       <td> 
        <asp:TextBox ID="txtHospitalNumber" runat="server" Height="35px" Width="223px"></asp:TextBox> 
       </td> 
      </tr> 
      <tr> 
       <td class="auto-style7">NHS Number</td> 
       <td> 
        <asp:TextBox ID="txtNhsNumber" runat="server" Height="35px" Width="223px"></asp:TextBox> 
       </td> 
      </tr> 
      <tr> 
       <td class="auto-style7">Partient Surname</td> 
       <td> 
        <asp:TextBox ID="txtSurname" runat="server" Height="35px" Width="223px"></asp:TextBox> 
       </td> 
      </tr> 
      <tr> 
       <td class="auto-style7">Patient Forename</td> 
       <td> 
        <asp:TextBox ID="txtForename" runat="server" Height="35px" Width="223px"></asp:TextBox> 
       </td> 
      </tr> 
      <tr> 
       <td class="auto-style7">Patient DOB</td> 
       <td> 
        <asp:TextBox ID="txtDOB" runat="server" Height="35px" Width="223px"></asp:TextBox> 
       </td> 
      </tr> 
      <tr> 
       <td class="auto-style7">Gender</td> 
       <td> 
        <asp:TextBox ID="txtGender" runat="server" Height="35px" Width="223px"></asp:TextBox> 
       </td> 
      </tr> 
      <tr> 
       <td class="auto-style7">Address</td> 
       <td> 
        <asp:TextBox ID="txtAddress" runat="server" Height="60px" TextMode="MultiLine" Width="223px"></asp:TextBox> 
       </td> 
      </tr> 
      <tr> 
       <td class="auto-style7">Post Code</td> 
       <td> 
        <asp:TextBox ID="txtPostcode" runat="server" Height="35px" Width="223px"></asp:TextBox> 
       </td> 
      </tr> 
      <tr> 
       <td class="auto-style7">Ethnic Group</td> 
       <td> 
        <asp:TextBox ID="txtEthnic" runat="server" Height="35px" Width="223px"></asp:TextBox> 
       </td> 
      </tr> 
      <tr> 
       <td class="auto-style7">Registered GP/PCG</td> 
       <td> 
        <asp:TextBox ID="txtGP" runat="server" Height="35px" Width="223px"></asp:TextBox> 
       </td> 
      </tr> 
     </table> 

    </div> 
    <asp:LinkButton ID="lnkPrevious" runat="server" OnClick="PreviousData" >Previous</asp:LinkButton> 

    <asp:LinkButton ID="lnkNextData" runat="server" OnClick="NextData">Next</asp:LinkButton> 

    <asp:LinkButton ID="lnkLoadDatabase" runat="server" OnClick="LoadDatabase">Load to Database</asp:LinkButton> 

C#コード

// display patient details in the form 
protected void btnSearch_Click(object sender, EventArgs e) 
    {   
     con = new SqlConnection(@"Data Source=;Initial Catalog=;Persist Security Info=True;User ID=;Password="); 
     con.Open(); 
     SqlCommand cmd3 = con.CreateCommand(); 

     cmd3.CommandText = @"SELECT * FROM ecamis WHERE 

             Surname = @SearchCriteria and [email protected] "; 
     cmd3.Parameters.AddWithValue("@SearchCriteria", txtSearchSurname.Text); 
     cmd3.Parameters.AddWithValue("@DOB", txtSearchDOB.Text); 

     da = new SqlDataAdapter(cmd3); 

     da.Fill(dt); 
       i = 0; 
       dr = dt.Rows[i];      
      txtHospitalNumber.Text = Convert.ToString(dr[1]); 
      txtNhsNumber.Text = Convert.ToString(dr[2]); 
      txtSurname.Text = Convert.ToString(dr[3]); 
      txtForename.Text = Convert.ToString(dr[4]); 
      txtDOB.Text = Convert.ToString(dr[5]); 
      txtGender.Text = Convert.ToString(dr[6]); 
      txtAddress.Text = Convert.ToString(dr[7]); 
      txtPostcode.Text = Convert.ToString(dr[8]); 
      txtEthnic.Text = Convert.ToString(dr[9]); 
      txtGP.Text = Convert.ToString(dr[10]); 

    } 
    // search for previous data 
    protected void PreviousData(object sender, EventArgs e) 
    { 
     if (i == 0) 
     { 
      Response.Write("First record !"); 
       lnkPrevious.Enabled = false; 
     } 

     else 
     { 
      i--; 

    dr = dt.Rows[i]; // Error Here " Additional information: There is no row at position 1." 
      txtHospitalNumber.Text = Convert.ToString(dr[1]); 
      txtNhsNumber.Text = Convert.ToString(dr[2]); 
      txtSurname.Text = Convert.ToString(dr[3]); 
      txtForename.Text = Convert.ToString(dr[4]); 
      txtDOB.Text = Convert.ToString(dr[5]); 
      txtGender.Text = Convert.ToString(dr[6]); 
      txtAddress.Text = Convert.ToString(dr[7]); 
      txtPostcode.Text = Convert.ToString(dr[8]); 
      txtEthnic.Text = Convert.ToString(dr[9]); 
      txtGP.Text = Convert.ToString(dr[10]); ; 
     }    
    } 
    // Display next patient data 
    protected void NextData(object sender, EventArgs e) 
    { 
     if (i == (dt.Rows.Count - 1)) 
     { 
      Response.Write("Last record !"); 
      lnkNextData.Enabled = false; 
     } 
     else 
     { 
      i++; 
      dr = dt.Rows[i]; // Error Here " Additional information: There is no row at position 1." 
      txtHospitalNumber.Text = Convert.ToString(dr[1]); 
      txtNhsNumber.Text = Convert.ToString(dr[2]); 
      txtSurname.Text = Convert.ToString(dr[3]); 
      txtForename.Text = Convert.ToString(dr[4]); 
      txtDOB.Text = Convert.ToString(dr[5]); 
      txtGender.Text = Convert.ToString(dr[6]); 
      txtAddress.Text = Convert.ToString(dr[7]); 
      txtPostcode.Text = Convert.ToString(dr[8]); 
      txtEthnic.Text = Convert.ToString(dr[9]); 
      txtGP.Text = Convert.ToString(dr[10]); 
     } 

    } 
+1

少し離れていますが、これを見てみたいです。 http://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/ –

+0

クエリが2レコード未満を返しているようです。そして、2番目のレコード(1位)にアクセスしようとしています。 – David

+0

@Davidはい2つ以上のレコードを返すクエリです。レコードを表示するために前または次の文字を使用しています。 –

答えて

0

エラーメッセージはかなりあなたが知る必要があるすべてを語っています;コードがデータテーブルを見るようになった時点で、位置1に行がありません。おそらくあなたはデータテーブルを塗りつぶして、検索後に結果を返し、次のボタンをクリックして、コードが再び実行されています...

しかし、データテーブルにはまだ3ユーザーが最初に(最後のページリクエスト時に)検索したときに、実際には空になっていた行。

DataTableをクラスファイルの先頭のように宣言すると、毎回インスタンス化されますリクエストが入ったときに、その中にデータを保存/復元しようとする試みは一切行いません。むしろ、データがそこに存在することを期待しており、ユーザーページのナビゲーション全体で生き残ることはできますが、設計通りにはできません。

+0

問題はインデックス1であるように見えます –

+0

脳の遅延、ごめんなさい - 私は1を読んで忘れてしまい、0であるかのようにアドバイスしました –

+0

もう一つの原因として、クエリ自体は問題ありませんが、 'PreviousData'または' NextData' 'btnSearch_Click'が実行されるので、テーブルにはまだデータが入力されていません。これはASP.NETアプリケーションであり、ページのリフレッシュによってページの状態がリセットされ、テーブルが空になる可能性があります。 –

関連する問題