Search code examples
c#.netwinformsdata-bindingbindingsource

Image Databinding to the pictureBox


I have tried to bind the image from the column "Applicant's Image" in the datatable "Applicant's Details" in Data Set "data_set" through two methods. But When I run the Form Application I see no image displayed in the picturebox "imgusr". My binding source name is "bindSource".

Assuming the data_set retrieves everything correctly, what could be problem for image not being loaded into the picturebox "imgusr"??

Also, the picturebox property of sizeMode to "zoom".

    private void Update_Load(object sender, EventArgs e){
        data_set = blobj.srcforVU();
        bindSource.DataSource = data_set;
        bindSource.DataMember = "Applicant's Details";
        lbidvalue.DataBindings.Add(new Binding("Text", bindSource, "Applicant's ID", false));

        //method 1
        //Binding binding = new Binding("Image", bindSource, "Applicant's Image", true, DataSourceUpdateMode.OnPropertyChanged);
        //binding.Format += new ConvertEventHandler(binding_Format);
        //imgusr.DataBindings.Add(binding);
        //method 2
        imgusr.DataBindings.Add(new Binding("Image", bindSource, "Applicant's Image", true));

        tbfname.DataBindings.Add(new Binding("Text", bindSource, "First Name", true));
        tblname.DataBindings.Add(new Binding("Text", bindSource, "Last Name", true));
        tbgender.DataBindings.Add(new Binding("Text", bindSource, "Gender", true));
        tbbdate.DataBindings.Add(new Binding("Text", bindSource, "Birth Date", true));
        tbmob.DataBindings.Add(new Binding("Text", bindSource, "Mobile No", true));
        tbadd.DataBindings.Add(new Binding("Text", bindSource, "Address", true));
        tbcntry.DataBindings.Add(new Binding("Text", bindSource, "Country", true));
        tbmstat.DataBindings.Add(new Binding("Text", bindSource, "Is Married", true));
        tbspfname.DataBindings.Add(new Binding("Text", bindSource, "Spouse's First Name", true));
        tbsplname.DataBindings.Add(new Binding("Text", bindSource, "Spouse's Last Name", true));
        tbspage.DataBindings.Add(new Binding("Text", bindSource, "Spouse's Age", true));
        tbchild.DataBindings.Add(new Binding("Text", bindSource, "No Of Children", true));
        bindNavigator.BindingSource = bindSource;

        afterloadoptions();
    }

public void binding_Format(object sender, ConvertEventArgs e)
    {
        string path = (string)e.Value;
        e.Value = Image.FromFile(path);
    }

Solution

  • The solution can be as simple as this:

    imgusr.DataBindings.Add(new Binding("Image", data_set, 
                                        "yourtablename.yourcolumnname", true));
    

    Note that you need to tell the Binding to do the formatting by setting the last parameter (enableFormatting) to true. No more special code is needed to process the image.

    Also note that I didn't try the necessary formatting to use blanks and apostrophes in the column name. I recommend using standard names!

    And finally make sure to set the TableName property of the Table you want to use in your DataSet:

    data_set.Tables[0].TableName = "yourtablename";
    

    Update from your discussion it seems that you do not save the image data correctly to your dbms. Here is a version of your routine, that should work better:

    byte[] img_byte = null;
    long imgfilelength = 0;
    
    private void StoreImage(string ChosenFile)
    {
        try { 
            using (Image img = Image.FromFile(ChosenFile))
            using (MemoryStream ms = new MemoryStream())
            {
                img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
                ms.Close();
                img_byte = ms.ToArray();
                imgfilelength = img_byte.Length;
            }
        } catch (Exception e) { MessageBox.Show(e.ToString()); }
    }
    

    Testing is as simple as that:

    private void test_button_Click(object sender, EventArgs e)
    {
        StoreImage(someImageFile);
        using (MemoryStream ms = new MemoryStream(img_byte))
        {
            aPictureBox.Image = Image.FromStream(ms);
        }
    }
    

    Do make sure to use the correct file format, e.g. Png or Jpeg etc..