2011-12-04 1 views
1

私はあきらめています。 5時間まっすぐなものをたくさん試しました。私には何も来ていません。C# - データベースのIDにスキップ

私はレコードを追加し、データベースからレコードを削除できるC#アプリケーションを持っています。また、テキストボックスにアイテムを表示することもでき、次のボタンと前のボタンを使用してアイテムをナビゲートできます。私は上記と呼ばれる方法がNavigateRecordsこの

MaxRows = ds1.Tables["Laptops"].Rows.Count; 

ようなものである

private void btnNext_Click(object sender, EventArgs e) 
    { 
     if (inc != MaxRows - 1) 
     { 
      inc++; 
      NavigateRecords(); 
     } 
     else 
     { 
      MessageBox.Show("You have reached the end of available items", "End of Available Items", MessageBoxButtons.OK, MessageBoxIcon.Information); 
     } 
    } 

場合、MaxRowsであり、次へボタンの下のように、このコードは、私がオートナンバーIDフィールドがここで

private void NavigateRecords() 
    { 
     DataRow dRow = ds1.Tables["Laptops"].Rows[inc]; 

     txtMaker.Text = ds1.Tables["Laptops"].Rows[inc].ItemArray.GetValue(1).ToString(); 
     txtModel.Text = ds1.Tables["Laptops"].Rows[inc].ItemArray.GetValue(2).ToString(); 
     txtPrice.Text = ds1.Tables["Laptops"].Rows[inc].ItemArray.GetValue(3).ToString(); 
     txtBids.Text = ds1.Tables["Laptops"].Rows[inc].ItemArray.GetValue(4).ToString(); 
     txtScreen.Text = ds1.Tables["Laptops"].Rows[inc].ItemArray.GetValue(5).ToString(); 
     txtCPU.Text = ds1.Tables["Laptops"].Rows[inc].ItemArray.GetValue(6).ToString(); 
     txtMemory.Text = ds1.Tables["Laptops"].Rows[inc].ItemArray.GetValue(7).ToString(); 
     txtHD.Text = ds1.Tables["Laptops"].Rows[inc].ItemArray.GetValue(8).ToString(); 
     picLaptops.Image = Image.FromFile(ds1.Tables["Laptops"].Rows[inc].ItemArray.GetValue(9).ToString()); 
    } 

あります(テキストボックスにIDを入力することで)スキップして、別のテキストボックスに適切なレコードを表示できるようにする(Accessデータベースを参照してください)

私の問題は、どうすればこのことですか? NavigateRecordsのテキストボックスに正しい行が表示され、グローバルに0に設定された "inc"変数も更新される必要があります。たとえば、ユーザーがプログラムを起動し、ID 7と言うとスキップすると、そのレコードが表示されますしかし、これを行うときには、incは行番号で更新する必要があります。次のページをクリックするとid 8とid 2になります。私はこれまでこれを持っています。

あなたの2番目のコードサンプル変更
private void btnSkip_Click(object sender, EventArgs e) 
    { 
     string searchFor = txtSkip.Text; 
     DataRow[] Skip; 
     int results = 0; 

     Skip = ds1.Tables["Laptops"].Select("ID='" + searchFor + "'"); 

     results = Skip.Length; 

     if (results > 0) 
     { 
      DataRow dr1; 

      for (int i = 0; i < MaxRows; i++) 
      { 
       // who knows what to do here.... or getting every row is even the right thing to do... 

      } 

     } 
     else 
     { 
      MessageBox.Show("No item found"); 
     } 
    } 
+0

idが一意である場合、Selectメソッドは1つの行のみを返すことがわかります。この問題は、SQLでは非常に簡単ですが、単純に、トップ1からラップトップのWHERE id> @currentID ORDER BY id ASCを選択することができます。次に、SELECT TOP 1 FROM Laptops WHERE id 0およびインデックス dash

+0

また、Windowsフォームを使用している場合は、次のものを使用できます。http://msdn.microsoft.com/en-us/library/2wcswths(v=vs.80).aspxおよびhttp://msdn.microsoft.com /en-us/library/ms158105(v=VS.80).aspxこれを行うためのフレームワークコントロールです。 – dash

答えて

6

private void btnSkip_Click(object sender, EventArgs e) 
{ 
    string searchFor = txtSkip.Text; 
    DataRow[] target = ds1.Tables["Laptops"].Select("ID='" + searchFor + "'"); 
    // I suspect that this should really not be a string, so ("ID=" + searchFor); 

    if (target.Count() == 1) { 
     inc = ds1.Tables["Laptops"].Rows.IndexOf(target[0]); 
     NavigateRecords(); 
    } else { //there can be no more than one row, so this means no matches 
     MessageBox.Show("No item found"); 
    } 
} 

を...これはIDがテーブル内で一意の識別子であると仮定しています。

+0

はい、IDは常に一意です。あなたのコードにペーストしましたが、 "演算子 '=='はif文(target.Count stuff)の周りの 'メソッドグループ'と 'int'型のオペランドには適用できません。 –

+0

お詫びと編集。 'System.Data.DataTable'には 'IndexOf'の定義が含まれておらず、 'IndexOf'の型が 'System.Data.DataTable'の最初の引数を受け入れる拡張メソッドが含まれていないというコードでIndexOfに 'Count()' – sq33G

+0

が必要です'が見つかりました(使用しているディレクティブまたはアセンブリ参照がありませんか?) –

0

あなたのコードを少し調べてみると、あなたのforループ内でNavigateRecords()を呼び出す必要があるようです。

また、UI開発に取り掛かっただけでは、特にWPFで作業している場合は、MVVMデザインパターンを見てみてください。 WinFormsなどで作業している場合は、おそらくMVPパターンを調べる価値があります。どちらの方法でも、これらのパターンはプレゼンテーションをアプリケーションロジックから分離するのに役立ち、このような問題を単純化する可能性があります。

関連する問題