1

テキストボックスから値を取得し、その値を使用してディレクトリから画像を選択する子フォームを開くWindowsフォーム(親)があります。特定の値に対して複数の画像が見つかった場合、フォームを変更して、さまざまな画像を表示するために移動するためのいくつかのボタン ([次へ] と [前へ]) を表示するようにしました。最初に親フォームを開き、値を入力してから form.show() を使用して子フォームを表示すると、すべてが期待どおりに機能します。ただし、親フォームに別の値が入力された場合 (子フォームは開いたり終了したり (非表示) できます)、[次へ] ボタンをクリックすると、リストにある画像の数に関係なく、クリック イベントのコードが再度実行されます。 (imagesFound)。List(imagesFound) に 3 つの画像があり、デバッグ モードでコードをステップ実行すると、btnNext クリック イベントが 3 回連続して発生します。もちろん、これは GetMultiImages メソッドを実行します。これにより、画像を表示するシーケンスがすべてになります。繰り返しますが、値が親フォームに初めて入力されたときは発生しません。リストとその他の変数が GetImage メソッドでクリアされていることを確認しました。私は困惑しています...何かアイデアはありますか?

フォーム1:

public partial class Form1 : Form
{
    private string parcelID;
    Form2 viewer = new Form2();
    public Form1()
    {
        InitializeComponent();
    }
    private void button1_Click(object sender, EventArgs e)
    {
        parcelID = txtParID.Text;
        ShowViewer();
    }
    private void ShowViewer()
    {
        viewer.GetImage(parcelID);
        if (viewer.NoImageFound == true)
        {
            viewer.Show();
            viewer.Focus();     
        }
        else if (viewer.NoImageFound == false)
        {
            viewer.Hide();      
        }                             
    }
}

子フォーム:

public partial class Form2 : Form
{
    public Button btnNext = new Button();
    public Button btnPrev = new Button();
    private List<string> imagesFound = new List<string>();
    private string Path;
    private string parcel;
    private int increment;
    private int maxNum;
    public bool NoImageFound;

    //multi image members
    private string firstMultiItem;
    private string selectMultiImage;
    Image parMultiImage;

    public Form2()
    {
        InitializeComponent();
    }

    public void GetImage(string ParcelID)
    {
        NoImageFound = true;
        parcel = ParcelID;
        increment = 0;
        maxNum = 0;
        firstMultiItem = null;
        selectMultiImage = null;
        parMultiImage = null;
        imagesFound.Clear();
        Path = "........\\Images\\";
        try
        {
            if (!string.IsNullOrEmpty(parcel))
            {
                string parcelTrim = parcel.Substring(0, 6);
                Path = Path + parcelTrim + "\\";
                foreach (string s in Directory.GetFiles(Path, parcel + "_" + "*"))
                {
                    string trimString = s.Replace(Path, "");
                    imagesFound.Add(trimString);
                }
                if ((imagesFound.Count == 0))
                {
                    MessageBox.Show("No images found for ParcelID: " + parcel);
                    picBox.Image = null;
                    this.Text = "";
                    NoImageFound = false;

                }
                else
                {
                    if (imagesFound.Count == 1)
                    {
                        string firstItem = imagesFound[0].ToString();
                        string selectImage = Path + firstItem;
                        Image parImage = Image.FromFile(selectImage);
                        //in order to access the picture box control you have to change it's 
                        //access modifier (Modifier) from private to public. Defaults to private
                        picBox.Image = parImage;
                        picBox.SizeMode = PictureBoxSizeMode.StretchImage;
                        this.Text = parcel;
                        SingleForm();
                    }
                    else if (imagesFound.Count > 1)
                    {
                        firstMultiItem = imagesFound[0].ToString();
                        maxNum = imagesFound.Count;
                        selectMultiImage = Path + firstMultiItem;
                        parMultiImage = Image.FromFile(selectMultiImage);
                        picBox.Image = parMultiImage;
                        picBox.SizeMode = PictureBoxSizeMode.StretchImage;
                        this.Text = parcel;
                        MultiImageForm();

                    }
                }
            }
            else
            {
                MessageBox.Show("No ParcelID");
            }
        }
        catch (DirectoryNotFoundException)
        {
            string text = parcel;
            MessageBox.Show("ParcelID: " + text + " could not be found.  The directory may be missing.", "There's a problem locating the image.",
                MessageBoxButtons.OK, MessageBoxIcon.Warning);
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

    private void SingleForm()
    {
        this.Height = 400;
        btnNext.Visible = false;
        btnPrev.Visible = false;
    }

    private void MultiImageForm()
    {
        //set form properties
        this.Text = parcel;
        this.Height = 432;
        //set btnNext properties
        btnNext.Location = new Point(307, 375);
        btnNext.Size = new Size(75, 25);
        btnNext.Font = new Font("Maiandra GD", 10, FontStyle.Bold);
        btnNext.Text = ">>";
        //add btnNext to form
        this.Controls.Add(btnNext);
        btnNext.Visible = true;
        btnNext.Enabled = true;
        //creating event handler for btnNext
        btnNext.Click += new EventHandler(btnNext_Click);
        //set btnPrev properties
        btnPrev.Location = new Point(12, 375);
        btnPrev.Size = new Size(75, 25);
        btnPrev.Font = new Font("Maiandra GD", 10, FontStyle.Bold);
        btnPrev.Text = "<<";
        //add btnPrev to form
        this.Controls.Add(btnPrev);
        btnPrev.Visible = true;
        btnPrev.Enabled = false;
        //creating event handler for btnPrev
        btnPrev.Click += new EventHandler(btnPrev_Click);

    }

    private void GetMultiImages()
    {
        try
        {
            firstMultiItem = imagesFound[increment].ToString(); 
            selectMultiImage = Path + firstMultiItem;
            parMultiImage = Image.FromFile(selectMultiImage);
            picBox.Image = parMultiImage;
            picBox.SizeMode = PictureBoxSizeMode.StretchImage;
        }
        catch (IndexOutOfRangeException)
        {
            MessageBox.Show("Index was out of range.");
        }
    }

    private void btnNext_Click(object sender, System.EventArgs e)
    {
        if (increment != maxNum - 1)
        {
            increment++;
            GetMultiImages();
        }
        EnableButtons();
    }

    private void btnPrev_Click(object sender, System.EventArgs e)
    {
        if (increment > 0)
        {
            increment--;
            GetMultiImages();
        }
        EnableButtons();
    }

    private void EnableButtons()
    {
        if (increment == 0)
        {
            btnPrev.Enabled = false;
            btnNext.Enabled = true;
        }
        else if (increment > 0 & increment != maxNum - 1)
        {
            btnPrev.Enabled = true;
            btnNext.Enabled = true;
        }
        else if (increment == maxNum - 1)
        {
            btnPrev.Enabled = true;
            btnNext.Enabled = false;
        }
    }

    private void Form2_FormClosing(object sender, FormClosingEventArgs e)
    {
        //overriding closing event
        this.Hide();
        e.Cancel = true;
    }
}
4

1 に答える 1