Как изменить выбранный элемент в дочернем классе с помощью основного класса?

#c# #winforms

#c# #winforms

Вопрос:

У меня проблема с моим кодом. Я хочу очистить свою гистограмму, которая находится в дочернем классе, и установить новые параметры. Но когда я использую в основном классе FormResult formChild = new FormResult(); и следующем formChild.histogram.Series.Clear(); , ничего не работает, и я не вижу никаких результатов.

В основном классе:

 private void stretchHistogram_Click(object sender, EventArgs e)
{
    FormResult formChild = new FormResult();
    formChild.histogram.Series.Clear();
    formChild.histogram.Show();        
}
  

И дочерний класс:

 public partial class FormResult : Form
{
    private const int MIN_VALUE = 0;
    private const int MAX_VALUE = 255;
    private int[] valueHistogram = new int[MAX_VALUE   1];

    public FormResult()
    {
        InitializeComponent();
    }

    private void FormResult_Load(object sender, EventArgs e)
    {
        var mainForm = new APOForm();

        FormResult formResult = new FormResult();
        formResult.Owner = this;

        // Generate PictureBox
        pictureBox.Image = Image.FromFile(mainForm.getMyPath());
        pictureBox.SizeMode = PictureBoxSizeMode.Zoom;
        pictureBox.Show();

        // Change image for bitmap array
        Bitmap bm = (Bitmap)pictureBox.Image;

        // Create table for pixel value for histogram

        for(int i=0; i<MAX_VALUE;   i)
        {
            valueHistogram[i] = 0;
        }

        for (int x=0; x<bm.Width;   x)
        {
            for(int y=0; y<bm.Height;   y)
            {
                Color c = bm.GetPixel(x, y);
                valueHistogram[c.R]  = 1;
            }
        }

        // ------------ Generate histogram
        histogram.ChartAreas[0].AxisX.Minimum = MIN_VALUE;
        histogram.ChartAreas[0].AxisX.Maximum = MAX_VALUE;
        histogram.ChartAreas[0].AxisY.Minimum = 0;
        histogram.Series.Clear();
        histogram.Series.Add("S");
        histogram.Series["S"].IsVisibleInLegend = false;

        int maxAxisY = 0;

        for (int i=0; i< MAX_VALUE 1;   i)
        {
            if(maxAxisY < valueHistogram[i]) { maxAxisY = valueHistogram[i];  }

            histogram.Series["S"].Points.AddXY(i, valueHistogram[i]);  
        }

        histogram.ChartAreas[0].AxisY.Maximum = maxAxisY;
        histogram.Show();
    }
}
  

Комментарии:

1. Когда вы создаете новый экземпляр дочерней формы ( FormResult formChild = new FormResult(); ), вы затем пытаетесь что -то изменить в этом новом экземпляре (который вы никогда не показываете), а не в исходном объекте класса, поэтому ничего не происходит. Кстати, вы не устанавливаете владельца вручную : вы делаете это, когда показываете новую форму, как formChild.Show(this) . this Ссылкой будет Owner of formChild . В любом случае вы не устанавливаете его в себя: formResult.Owner = this; .

Ответ №1:

Вы должны сохранить ссылку на вспомогательную форму в основной форме и использовать ссылку для управления созданной вспомогательной формой.

 public class APOForm : Form
{
    FormResult formChild;

    // this is a pseudo method to show how to create a sub form.
    private void ShowChildForm()
    {
         formChild = new FormResult();
         formChild.MdiParent = this;
         formChild.Show();
    }

    private void stretchHistogram_Click(object sender, EventArgs e)
    {
        if(formChild != null)
        {
            formChild.histogram.Series.Clear();
            formChild.histogram.Show();
        }    
    }
}
  

А в FormResult классе не нужно создавать новую какую-либо форму.

 public partial class FormResult : Form
{
    private void FormResult_Load(object sender, EventArgs e)
    {
        //var mainForm = new APOForm();

        //FormResult formResult = new FormResult();
        //formResult.Owner = this;

        ......
    }
}
  

Комментарии:

1. Спасибо, но один вопрос, как установить в ShowChildForm() MdiParent?

2. formChild.Show(); formChild.MdiParent = this;

3. Как вы взаимодействуете с, stretchHistogram когда у вас есть formChild.ShowDialog(this) , модальной формой?

4. Привет @Jimi, я думаю, это не важно, поскольку я не знаю, как op использует вспомогательную форму, поэтому я просто написал этот метод, чтобы показать способ создания ссылки. И вы правы, и после комментария op я должен внести некоторые обновления

5. Суть была в следующем: я хочу очистить свою гистограмму, которая находится в дочернем классе, и установить новые параметры . Попытка formChild.histogram.Series.Clear(); является прямым следствием. При этом ShowDialog() любая попытка из вызывающей формы (формы, которая создает экземпляр formChild ) отключается, поскольку вы больше не можете взаимодействовать с вызывающей стороной. Итак, вы, вероятно, хотите .Show(this) . Если вызывающий объект не является MDIForm. Тогда установка владельца бессмысленна.