3

グラフ作成プログラムを作成していますが、ユーザーが作成したグラフの外観を変更できるようにしたいと考えています。シリーズの色、データ ポイントのサイズなどを変更する機会を提供します。私は、propertyGrid を使用してこれを実行できるようにしています。しかし、スタック オーバーフローを使用する素晴らしい人々の助けを借りて、チャートのすべてのプロパティをプロパティ グリッドにインポートすることができました。グラフを propertyGrid に接続する方法がわからないので、グリッド内の何かを変更すると、グラフが変更されます。

これまでのところ、

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        magRadioBox.Checked = true;
        PropertyGrid propertyGrid1 = new PropertyGrid();
        propertyGrid1.CommandsVisibleIfAvailable = true;
        propertyGrid1.Text = "Graph and Plotting Options";
        propertyGrid1.PropertyValueChanged += propertyGrid1_PropertyValueChanged;

        this.Controls.Add(propertyGrid1);
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        this.Text = "MY Plot Program";
        propertyGrid1.SelectedObject = chart1; 
    }

    private void button1_Click(object sender, EventArgs e)
    {
        //some code that is populating my chart(chart1) with data 
        //....chart1 being filled with data 
    }

    private void propertyGrid1_PropertyValueChanged(object s , PropertyValueChangedEventArgs e)
    {
        //Getting the MyChart instance from propertyGrid 
        MyChart myChart = (MyChart)(((PropertyGrid)s.SelectedObject);
        //Calling the method that will refresh my chart1 
        myChart.Invalidate(); 
    }

上記のコードは私のフォーム用です。私の「MyChart」クラスコードは

namespace FFT_Plotter
{ 
    [DefaultPropertyAttribute("Text")]
    public class MyChart : Chart 
    {
        public event EventHandler PropertyChanged;

        private void OnPropertyChanged(object sender, EventArgs e)
        {
            EventHandler eh = propertyChanged;
            if(eh !=null)
            {
                eh(sender, e);
            }

            [BrowsableAttribute(false)]
            public new System.Drawing.Color BackColor
            {
                get { return BackColor; }//Here back color is just an example of a property, not necessarily one that I would make non-Browsable
                set 
                { 
                    base.BackColor = value; 
                    OnPropertyChanged(this,EventArgs.Empty);
                }
            }
        }
    }

上記のクラスにより、グラフのすべてのプロパティを含むプロパティ グリッドが得られ、必要に応じてそれらのプロパティを非表示にできます。しかし、今、chart1 を作成したグリッドに接続する方法を理解することに行き詰まっています。誰かがそれを行う方法について何かアドバイスがあれば、それは非常に役に立ちます.

4

2 に答える 2

2

を追加するpropertyGrid1.SelectedObject = myChartInstance;必要があります。次に、ユーザーがを介してプロパティをPropertyValueChanged変更するたびにトリガーされるイベント リスナーを追加する必要があります。したがって、変更が行われるたびにグラフを再描画すると仮定すると、コードは次のようになります。myChartInstancePropertyGrid

        private void propertyGrid1_PropertyValueChanged(object sender, PropertyValueChangedEventArgs e)
        {
           // Redraw the chart.
           chart1.Invalidate();
        }

        public Form1()
        {
            InitializeComponent();
            magRadioBox.Checked = true;
            PropertyGrid propertyGrid1 = new PropertyGrid();
            propertyGrid1.CommandsVisibleIfAvailable = true;
            propertyGrid1.Text = "Graph and Plotting Options";

            // Create your chart.
            chart1 = new MyChart();

            // Attach your chart to Property Grid.
            propertyGrid1.SelectedObject = (MyChart) chart1;
            propertyGrid1.PropertyValueChanged += propertyGrid1_PropertyValueChanged;

            this.Controls.Add(propertyGrid1);
        }
于 2013-02-26T19:11:13.837 に答える
0

StackOverflow の素晴らしいコミュニティの助けを借りて、これが私がまとめることができた答えでした (巨人の肩の上に立っています)

   public partial class Form1 : Form {
            public Form1()
            {
                InitializeComponent();
                magRadioBox.Checked = true;
                PropertyGrid propertyGrid1 = new PropertyGrid();
                propertyGrid1.CommandsVisibleIfAvailable = true;
                propertyGrid1.Text = "Graph and Plotting Options";
                propertyGrid1.PropertyValueChanged += propertyGrid1_PropertyValueChanged;

                this.Controls.Add(propertyGrid1);
            } private void Form1_Load(object sender, EventArgs e) { this.Text = "MY Plot Program"; propertyGrid1.SelectedObject = chart1;  }

        private void button1_Click(object sender, EventArgs e)  {//some code that is populating my chart(chart1) with data   .... //chart1 being filled with data   }

        private void propertyGrid1_PropertyValueChanged(object s , PropertyValueChangedEventArgs e) { 
myChart.Invalidate();  
}

これはMyChartクラスのコードです

namespace FFT_Plotter
{ 
    [DefaultPropertyAttribute("Text")]// This is where the initial position of the grid is set 
    public class MyChart : Chart 
    {
        public event EventHandler PropertyChanged;
private void OnPropertyChanged(object sender, EventArgs e)
{
EventHandler eh = propertyChanged;
if(eh !=null)
{
eh(sender, e);
}
        [BrowsableAttribute(false)]
        public new System.Drawing.Color BackColor
        {
            get { return BackColor; }//Here back color is just an example of a property, not necessarily one that I would make non-Browsable
            set { 
base.BackColor = value; 
OnPropertyChanged(this,EventArgs.Empty);
}
        }
    }
}

そして、これは Form1.Designer.CS で ,ではなくchart1aであると宣言しますMyChartSystem.Windows...Chart

...this.chart1  = new FFT_Ploter.MyChart(); ... private FFT_Plotter.MyChart chart1;  
于 2013-02-27T18:39:50.973 に答える