2017-02-09 6 views
3

次の図のように、MsExcelの「依存セル」に似た機能をDataGridViewに実装したいと考えています。 ベストは、宛先と依存するdatagridviewcellアドレスをパラメータとし、datagridview上に矢印を描く、ある種のペイント機能です。 どのようにすればいいですか?関数ペイント "依存セル"のデータグリッドビュー

Excel table with

+0

DevExpressのようなサードパーティライブラリを使用します。 –

+0

アドバイスをありがとう@UweKeimしかしDevExpressのライセンスは900 $と似ていますので、残念ながらそれは本当に私の選択肢ではありません。 – mdziadowiec

答えて

4

あなたは、描画を行うためにPaintイベントを使用することができます。

のは、あなたがList<T>に接続するために、細胞を収集していると仮定しましょう:

List<Tuple<DataGridViewCell, DataGridViewCell>> DgvCells = 
          new List<Tuple<DataGridViewCell, DataGridViewCell>>(); 

今、あなたは多分このように、描画を行うためにDGVのPaintイベントをコーディングすることができます:それは使用しています

private void dataGridView1_Paint(object sender, PaintEventArgs e) 
{ 
    e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; 
    foreach(var t in DgvCells) 
    { 
     if (!(t.Item1.Displayed && t.Item2.Displayed)) continue; 
     Point p1 = GetCenter(dataGridView1.GetCellDisplayRectangle(
              t.Item1.ColumnIndex, t.Item1.RowIndex, true)); 
     Point p2 = GetCenter(dataGridView1.GetCellDisplayRectangle(
              t.Item2.ColumnIndex, t.Item2.RowIndex, true)); 
     using (Pen pen = new Pen(Color.Blue, 1) 
       { EndCap = System.Drawing.Drawing2D.LineCap.ArrowAnchor }) 
      e.Graphics.DrawLine(pen, p1, p2); 
    } 
} 

小さなヘルパー関数:

Point GetCenter(Rectangle r) 
{ return new Point(r.X + r.Width/2, r.Y + r.Height/2); } 

私はcリストに追加するCellMouseClickイベントのode。結果は次のようになります。

enter image description here

あなたがDGVたびにInvalidate()を呼び出す必要が

いつものように... StartCapまたは異なる色などを使用しての追加など、描画のスタイルを、コードを追加することができます接続するセルのリストから要素を追加または削除します。

これは単なる最小の例です。さまざまなエラーを捕らえるためのコードを追加したり、セルの1つが表示されていないときに何をするかを決めることができます。 (私は単に線を隠すだけです)

srcollingあなたはDGVもInvalidateにする必要があります!

+1

これは完璧です、ありがとう@TaW。 – mdziadowiec