クリック位置からデータを特定するには?

解決


しょう  2012-10-18 21:24:58  No: 147896  IP: 192.*.*.*

何度もすみません。
ローソク足をクリックすることで、その該当するデータを特定したく、あれこれ探しいてる内にここに行き着きました。
http://www.hanatyan.sakura.ne.jp/dotnet/chart24.htm
使えるかと思い、早速試しては見るもののエラーが出て四苦八苦しています。
なにぶん能力不足でどうにもなりません。
お手数をお掛けしますがよろしくお願いします。

Public Class Form1
    Private frgElement As Boolean
    '
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim tbl As New DataTable
        '列の作成
        With tbl.Columns
            .Add("日付", GetType(String))
            .Add("高値", GetType(Integer))
            .Add("安値", GetType(Integer))
            .Add("始値", GetType(Integer))
            .Add("終値", GetType(Integer))
        End With
        'データの追加
        tbl.Rows.Add("2012/08/1", 700, 300, 650, 550)
        tbl.Rows.Add("2012/08/2", 500, 200, 300, 400)
        tbl.Rows.Add("2012/08/7", 650, 400, 600, 450)
        tbl.Rows.Add("2012/08/8", 800, 300, 300, 550)
        '初期化    
        Chart1.Series.Clear()
        'グラフの種類,系列,軸の設定
        Dim rosoku = Chart1.Series.Add("ローソク足")
        With rosoku
            .ChartType = DataVisualization.Charting.SeriesChartType.Candlestick
            .XValueMember = "日付"
            .YValueMembers = "高値, 安値, 始値, 終値"
            .IsVisibleInLegend = False
        End With
        Chart1.DataSource = tbl
        Chart1.DataBind()
        Chart1.ChartAreas(0).AxisX.MajorGrid.Enabled = False
        Chart1.ChartAreas(0).AxisX.MinorGrid.Enabled = False
    End Sub
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        'Microsoft Chart Control で クリックした位置の要素を取得
        frgElement = Not frgElement   'クリック毎にフラグを設定
    End Sub
    Private Sub Chart1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Chart1.MouseClick
        'クリックした位置の要素を取得
        Dim htrResult As HitTestResult = Chart1.HitTest(e.X, e.Y)
        If htrResult.ChartElementType = ChartElementType.DataPoint And frgElement = True Then
            Dim i As Integer = htrResult.PointIndex
            Dim dp As DataPoint = htrResult.Series.Points(i)
            For j As Integer = 0 To Chart1.Series.Count - 1
                If Chart1.Series(j).Name = htrResult.Series.Name Then
                    Dim SeriesNo As Integer = j
                    '            Debug.Print(SeriesNo.ToString)
                    Exit For
                End If
            Next
            'クリックした位置の要素を表示
            MessageBox.Show(String.Format("{0}({1}) : {2}", htrResult.Series.Name, dp.AxisLabel, dp.YValues(0)))
        End If
    End Sub
End Class

編集 削除
shu  2012-10-19 07:46:38  No: 147897  IP: 192.*.*.*

コピーして実行しましたが特に実行時エラーは
発生しませんでした。Importsは追加しましたが。
どんなことをしたときにどんなえらーがでたのかかかれた
ほうがよいです。

編集 削除
しょう  2012-10-19 12:32:50  No: 147898  IP: 192.*.*.*

shuさん、ありがとうございます。

>Importsは追加しましたが。
調べてみましたがImportsの意味が理解出来ませんでした(^^;

>どんなことをしたときにどんなえらーがでたのかかかれたほうがよいです。
これからは書くようにします。
  型 'HitTestResult' が定義されていません。
  型 'DataPoint' が定義されていません。
  'ChartElementType' は宣言されていません。アクセスできない保護レベルになっています。
エラーはこの三つです。

よろしくお願いします。

編集 削除
shu  2012-10-19 14:24:03  No: 147899  IP: 192.*.*.*

やはりImportsでしたか。

例えばDataPointですが名前空間を含むフルの型名は
『System.Windows.Forms.DataVisualization.Charting.DataPoint』
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.datavisualization.charting.datapoint.aspx
なので何も指定しない場合は
> Dim dp As DataPoint
Dim dp As System.Windows.Forms.DataVisualization.Charting.DataPoint
のように書かないといけません。

各vbファイルの先頭にImportsを書くと書いた部分を省略することが出来るようになります。
この場合
Imports System.Windows.Forms.DataVisualization.Charting
を記述することにより提示された記述によるエラーが解消されます。
また
プロジェクトのプロパティから参照ページを表示してインポートされた名前空間に追加することによりプロジェクト全体で有効になります。

Importsには書き方がもう1つあり
例えば
Imports Charting=System.Windows.Forms.DataVisualization.Charting
と記述すると
Dim  dp As Charting.DataPoint
という書き方が可能になります。このときはDataPointだけの記述はエラーに
なります。

編集 削除
しょう  2012-10-19 22:45:37  No: 147900  IP: 192.*.*.*

shuさん、ありがとうございます。
今現在、困ってるところをこのように教えて頂く事は本当に有り難くただただ感謝!感謝!です。

Charting=System.Windows.Forms.DataVisualization.Charting
をインポートされた名前空間に追加しましたが、今度は…、

Cursor.Current = Cursors.Cross    の所で、
警告  1  インスタンスを経由する共有メンバー、定数メンバー、列挙型メンバー、または入れ子にされた型へのアクセスです。正規の式は評価されません。

が出てしまい、Imports System.Windows.Forms.DataVisualization.Charting  を記述する方法で対処しました。

すると今度は…、
Dim htrResult As HitTestResult = Chart1.HitTest(e.X, e.Y)    の所で、
エラー  1  'X' は 'System.EventArgs' のメンバーではありません。
エラー  2  'Y' は 'System.EventArgs' のメンバーではありません。
が出るようになってしまいました。

お教えの程よろしくお願いします。

編集 削除
しょう  2012-10-21 22:04:20  No: 147901  IP: 192.*.*.*

shuさん、お騒がせして申し訳ありません。
エラーは試行錯誤の途中での戻し忘れによるものでした。
教えて頂いたお陰で希望通りになりました。
本当にありがとうございました。

編集 削除