#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
offormChild
. В любом случае вы не устанавливаете его в себя: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. Тогда установка владельца бессмысленна.