2016-05-06 9 views
1

こんにちは私はdatagridviewの中にSQL Serverデータベースのデータを含むボタンを生成するコードを用意しています。しかし今、私はそれらをボタンを通してスクロールしたい。私はたくさんのことを試してみましたが、私はエラーがすでにこれについての投稿を見たことがありますが、誰かが私のために働いてくれました。ボタンを使用したDataGridViewのスクロール

< -----------------------------------マイコード-------- ----------------------------->

メソッドのDataGridViewを埋めるために:私の

public void TabelaFuncionario() 
{ 
    try 
    { 
     BDfuncionarios = new DataTable(); 
     string cmd = "My select string"; 
     var adpt = fConexao.GetDataAdapter(cmd); 
     BDfuncionarios.Clear(); 
     adpt.Fill(BDfuncionarios); 
    } 
    catch (Exception r) 
    { 
     MessageBox.Show(r.Message); 
    } 
} 

public void BotaoFuncionario() 
{ 
    try 
    { 
     TabelaFuncionario(); 
     PosXartigo = 1; 
     PosYartigo = 1; 

     //Apagar o painel todo 
     dataGridView1.Controls.Clear(); 
     foreach (DataRow row in BDfuncionarios.Rows) 
     { 
      int posicaoX = ((PosXartigo - 1) * Gap_Xartigo) + xInicial + (Largura_BotaoArtigo * (PosXartigo - 1)); 
      if (posicaoX > maximoxArtigo) 
      { 
       PosYartigo++; PosXartigo = 1; 
      } 
      else 
      { 
       PosXartigo = PosXartigo != 1 ? PosXartigo++ : 1; 
      } 
      int PontoX = ((PosXartigo - 1) * Gap_Xartigo) + xInicial + (Largura_BotaoArtigo * (PosXartigo - 1)); 
      int PontoY = ((PosYartigo - 1) * Gap_Yartigo) + yInicial + (Altura_BotaoArtigo * (PosYartigo - 1)); 
      Button bt1 = new Button(); 
      bt1.Location = new Point(PontoX, PontoY); 
      Mo mo = new Mo(); 
      mo.codmo = (int)row["Something"]; 
      mo.nome_func = (string)row["Something"]; 
      bt1.Name = "Botao" + NBotoes.ToString(); 
      bt1.Height = Altura_BotaoArtigo; 
      bt1.Width = Largura_BotaoArtigo; 
      bt1.BackColor = Color.Tan; 
      bt1.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Bold); 
      bt1.ForeColor = Color.Black; 
      bt1.Text = mo.nome_func; 
      bt1.Tag = mo; 
      bt1.FlatStyle = FlatStyle.Popup; 
      bt1.Click += btArtigo_click; 
      dataGridView1.Controls.Add(bt1); 

      NBotoes++; 
      PosXartigo++; 
     } 
    } 
    catch (Exception r) 
    { 
     MessageBox.Show(r.Message); 
    } 
} 

画像フォーム(それが助けかどうかを知りません):

http://imgur.com/f5G25nX

< -------------------------- EDITED-- ------------------------ ------->

私はこのようなことを試してみました:https://msdn.microsoft.com/en-us/library/system.windows.forms.datagridview.rowcount(v=vs.110).aspx

はその

のような範囲か何かの私を与え、

int row = dataGridView1.RowCount; 
MessageBox.Show(row+""); 

今これを試してみましたそれは私に0を表示します。どのように私はグリッド内のボタンを持つことができますが、0行がありますか?

+0

http://stackoverflow.com/questions/19648872/datagridview-how-to-jump-to-the-selected-row-in-search類似の質問 - 特定の行へのスクロールを含む – Squiggle

+0

_allはエラー_を返します。どのようなエラーがあり、何を試しましたか? –

+0

@NullException私は質問を編集しました –

答えて

0

私はuはコードは以下になりますはるかに優れていた望んでいたもののために、このパネルの代わりに、データグリッドを使用して問題を解決:

方法:今

public void TabelaFuncionario() 
    { 

     try 
     { 
      BDfuncionarios = new DataTable(); 
      string cmd = "your select"; 
      var adpt = fConexao.GetDataAdapter(cmd); 
      BDfuncionarios.Clear(); 
      adpt.Fill(BDfuncionarios); 
     } 
     catch (Exception r) 
     { 

      MessageBox.Show(r.Message); 
     } 
    } 

    public void BotaoFuncionario() 
    { 
     try 
     { 

      TabelaFuncionario(); 
      PosXartigo = 1; 
      PosYartigo = 1; 

      //Apagar o painel todo 
      panel2.Controls.Clear(); 
      foreach (DataRow row in BDfuncionarios.Rows) 
      { 
       int posicaoX = ((PosXartigo - 1) * Gap_Xartigo) + xInicial + (Largura_BotaoArtigo * (PosXartigo - 1)); 
       if (posicaoX > maximoxArtigo) 
       { 
        PosYartigo++; PosXartigo = 1; 
       } 
       else 
       { 
        PosXartigo = PosXartigo != 1 ? PosXartigo++ : 1; 
       } 
       int PontoX = ((PosXartigo - 1) * Gap_Xartigo) + xInicial + (Largura_BotaoArtigo * (PosXartigo - 1)); 
       int PontoY = ((PosYartigo - 1) * Gap_Yartigo) + yInicial + (Altura_BotaoArtigo * (PosYartigo - 1)); 
       Button bt1 = new Button(); 
       bt1.Location = new Point(PontoX, PontoY); 
       Mo mo = new Mo(); 
       mo.codmo = (int)row["Var1"]; 
       mo.nome_func = (string)row["Var2"]; 

       bt1.Name = "Botao" + NBotoes.ToString(); 
       bt1.Height = Altura_BotaoArtigo; 
       bt1.Width = Largura_BotaoArtigo; 
       bt1.BackColor = Color.Tan; 
       bt1.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Bold); 
       bt1.ForeColor = Color.Black; 
       bt1.Text = mo.nome_func; 
       bt1.Tag = mo; 
       bt1.FlatStyle = FlatStyle.Popup; 
       bt1.Click += btFuncionario_click; 
       panel2.Controls.Add(bt1); 

       NBotoes++; 
       PosXartigo++; 

      } 
     } 
     catch (Exception r) 
     { 

      MessageBox.Show(r.Message); 

     } 
    } 

PainelExtensionクラス:

public static class PanelExtension 
{ 
    public static void ScrollDown(this Panel p, int pos) 
    { 
     //pos passed in should be positive 
     using (Control c = new Control() { Parent = p, Height = 1, Top = p.ClientSize.Height + pos }) 
     { 
      p.ScrollControlIntoView(c); 
     } 
    } 
    public static void ScrollUp(this Panel p, int pos) 
    { 
     //pos passed in should be negative 
     using (Control c = new Control() { Parent = p, Height = 1, Top = pos }) 
     { 
      p.ScrollControlIntoView(c); 
     } 
    } 
} 

上下ボタンクリック:

private void upbt_Click(object sender, EventArgs e) 
    { 
     if (i >= 0) i = -1; 
     panel2.ScrollUp(i=i-30); 
    } 

    private void downbt_Click(object sender, EventArgs e) 
    { 
     if (i < 0) i = 0; 
     panel2.ScrollDown(i=i+20); 
    } 

私はこのように動作するようになったかもしれませんが、私はこれを選択する他の方法があるかもしれません。

関連する問題