C# Windows窗体打开新窗体以显示数据

C# Windows窗体打开新窗体以显示数据,c#,winforms,sql-server-2008,.net-4.5,C#,Winforms,Sql Server 2008,.net 4.5,请参见下图-在我的数据库中,我有3列,我对通过windows窗体显示结果感兴趣。在本例中,我从数据库中选择了“意大利面肉丸”配方,并单击了检索按钮,然后我将右边的两个文本框填充,一个包含配料,另一个包含烹饪步骤。请忽略我目前存储数据的方法,因为这不是我当前的问题 问题 我想要的基本功能是,我可以从下拉菜单中显示与用户选择相关的基本信息,尽管不是很好。然而,我想要的是,当用户单击检索按钮时,将弹出一个新窗口,显示该配方的标题、图片、成分和步骤。现在,我已经在项目中添加了一个名为Pop_up.cs的

请参见下图-在我的数据库中,我有3列,我对通过windows窗体显示结果感兴趣。在本例中,我从数据库中选择了“意大利面肉丸”配方,并单击了检索按钮,然后我将右边的两个文本框填充,一个包含配料,另一个包含烹饪步骤。请忽略我目前存储数据的方法,因为这不是我当前的问题

问题

我想要的基本功能是,我可以从下拉菜单中显示与用户选择相关的基本信息,尽管不是很好。然而,我想要的是,当用户单击检索按钮时,将弹出一个新窗口,显示该配方的标题、图片、成分和步骤。现在,我已经在项目中添加了一个名为Pop_up.cs的新表单,但是我不确定如何更改“Retrieve”方法以首先显示该表单,然后使用form1中用户指定的数据和从我的数据库检索的数据填充文本框/图片框,然后将其放置在表单上

检索方法

   //R E T R I E V E     B U T T O N 
        private void button3_Click(object sender, EventArgs e)
        {

            DataTable dataTable = dset.Tables[0];

            if (pictureBox2.Image != null)
            {
                pictureBox2.Image.Dispose();
            }

            FileStream FS1 = new FileStream("image.jpg", FileMode.Create);

            foreach (DataRow dataRow in dataTable.Rows)
            {

                if (dataRow[0].ToString() == comboBox1.SelectedItem.ToString())
                {

                    byte[] blob = (byte[])dataRow[1];
                    FS1.Write(blob, 0, blob.Length);
                    FS1.Close();
                    FS1 = null;
                    label5.Text = dataRow[3].ToString();
                    label6.Text = dataRow[2].ToString();
                    pictureBox2.Image = Image.FromFile("image.jpg");
                    pictureBox2.SizeMode = PictureBoxSizeMode.StretchImage;
                    pictureBox2.Refresh();
                }
            }
        }

修改弹出类的构造函数以获取参数。并编写FillData()方法从数据库加载配方数据

public partial class Pop_up : Form
    {
        public Pop_up(string recipe)
        {
            InitializeComponent();
            FillData(recipe);

        }
    }
在Retrive按钮的代码中显示弹出窗口。将Receipe名称作为参数传递

 //R E T R I E V E     B U T T O N 
    private void button3_Click(object sender, EventArgs e)
    {
      string recipeName = comboBox1.SelectedItem.ToString();
      Pop_up p = new Pop_up(recipeName);
      p.Show();
    }

假设Pop_up.cs具有以下控件

PictureBox pictureBox;
Label labelIngredients;
Label labelCookSteps;
那么Pop_up.cs可能看起来像:

public partial class Pop_up : Form
{
    public Pop_up()
    {
        InitializeComponent();        
    }

    public Pop_up(string recipeName, DataSet dset)
    {
        InitializeComponent();
        BindDataContext(recipeName, dset);

    }

    private void BindDataContext(string recipeName, DataSet dset)
    {
        DataTable dataTable = dset.Tables[0];

        if (pictureBox.Image != null)
        {
            pictureBox.Image.Dispose();
        }

        FileStream FS1 = new FileStream("image.jpg", FileMode.Create);

        foreach (DataRow dataRow in dataTable.Rows)
        {

            if (dataRow[0].ToString() == recipeName)
            {
                byte[] blob = (byte[])dataRow[1];
                FS1.Write(blob, 0, blob.Length);
                FS1.Close();
                FS1 = null;
                labelIngredients.Text = dataRow[3].ToString();
                labelCookSteps.Text = dataRow[2].ToString();
                pictureBox.Image = Image.FromFile("image.jpg");
                pictureBox.SizeMode = PictureBoxSizeMode.StretchImage;
                pictureBox.Refresh();
            }
        }
    } 
}
public partial class Form1 : Form
{
    //R E T R I E V E     B U T T O N 
    private void button3_Click(object sender, EventArgs e)
    {
      string recipeName = comboBox1.SelectedItem.ToString();
      Pop_up p = new Pop_up(recipeName, dset);
      p.Show();
    }
}
然后,Form1.cs中的Retrieve按钮可能如下所示:

public partial class Pop_up : Form
{
    public Pop_up()
    {
        InitializeComponent();        
    }

    public Pop_up(string recipeName, DataSet dset)
    {
        InitializeComponent();
        BindDataContext(recipeName, dset);

    }

    private void BindDataContext(string recipeName, DataSet dset)
    {
        DataTable dataTable = dset.Tables[0];

        if (pictureBox.Image != null)
        {
            pictureBox.Image.Dispose();
        }

        FileStream FS1 = new FileStream("image.jpg", FileMode.Create);

        foreach (DataRow dataRow in dataTable.Rows)
        {

            if (dataRow[0].ToString() == recipeName)
            {
                byte[] blob = (byte[])dataRow[1];
                FS1.Write(blob, 0, blob.Length);
                FS1.Close();
                FS1 = null;
                labelIngredients.Text = dataRow[3].ToString();
                labelCookSteps.Text = dataRow[2].ToString();
                pictureBox.Image = Image.FromFile("image.jpg");
                pictureBox.SizeMode = PictureBoxSizeMode.StretchImage;
                pictureBox.Refresh();
            }
        }
    } 
}
public partial class Form1 : Form
{
    //R E T R I E V E     B U T T O N 
    private void button3_Click(object sender, EventArgs e)
    {
      string recipeName = comboBox1.SelectedItem.ToString();
      Pop_up p = new Pop_up(recipeName, dset);
      p.Show();
    }
}

您想在新表单上显示配方信息,对吗?如果我错了,请纠正我。首先,我将创建一个Recipe类,使代码更具可读性。然后,当用户选择一个配方时,我会实例化一个配方对象,我会将该配方作为参数发送到新的Form2。@Sudhakar是的,图像右下角的所有内容,即图片,说明和成分需要在新窗口中打开我是否将弹出类的构造函数添加到我的form1.cs中?我不确定是否理解您的问题。您是否询问FillData方法?当您提到弹出类时,您是指我要打开的其他表单吗?如果是这样,为什么我要将表单实例化为“p”?请原谅我的疏忽您可以使用任意名称来代替“p”@SelectDistinct Yes弹出窗口是您的附加表单。p只是一个变量名,您可以随意使用。我在mscorlib.dll中收到一个未经处理的类型为“System.IO.IOException”的异常,它在FileSteam FS1=new FileSteam in Pop_up.cs抱歉,请忽略这一点,因为我的原始表单仍在尝试同时使用FileSteam,对其中一个进行评论可以解决这个问题