来自C#中Mysql数据库的WPF数据网格中的图像无法获得多于一个结果

问题描述 投票:-1回答:1

使用此代码,我可以从WPF中的C#中的Mysql数据库中获取一个图像。但我在数据库中有一个表格,其中包含所有国家/地区的名称及其旗帜等。当我查询选择许多或所有国家时,会出现错误“无法在此行”bi.BeginInit()“多次设置初始化状态”。提前致谢。

    string co = null;
    string na = null;
    string le = null;
    string gn = null;
    string A = "pak";
    BitmapImage bi = new BitmapImage();

    try
    {
        MySqlCommand cmd = new MySqlCommand("Select Code,Name,LifeExpectancy,GNP,flg from country where Name REGEXP '" + A + "'", connection);
        MySqlDataReader dataReader = cmd.ExecuteReader();
        while (dataReader.Read())
        {

            co = dataReader["Code"].ToString();
            na = dataReader["Name"].ToString();
            le = dataReader["LifeExpectancy"].ToString();
            gn = dataReader["GNP"].ToString();
            Byte[] bindata = (Byte[])dataReader["flg"];
            MemoryStream strm = new MemoryStream();
            strm.Write(bindata, 0, bindata.Length);
            strm.Position = 0;
            System.Drawing.Image img = System.Drawing.Image.FromStream(strm); 
            bi.BeginInit();
            MemoryStream ms = new MemoryStream();
            img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
            ms.Seek(0, SeekOrigin.Begin);
            bi.StreamSource = ms; 
            bi.EndInit();
            dt.Rows.Add(co, na, le, gn, bi);
            dataGridCustomers.ItemsSource = dt.DefaultView;
        }
    }
    catch (MySqlException ex)
    {
           MessageBox.Show(ex.ToString());
    }
c# mysql database wpf datagrid
1个回答
0
投票

这是因为您在循环之外创建了BitmapImage。因此,一旦进入循环,它就会继续尝试在同一图像上设置初始化状态。正如您的错误所述,您不能这样做。您需要做的是在每次迭代时创建一个新的BitmapImage。这可以通过移动线来实现

BitmapImage bi = new BitmapImage();

到循环的内部。除非有特定原因,否则您正在初始化它。

string co = null;
string na = null;
string le = null;
string gn = null;
string A = "pak";

try
{
    MySqlCommand cmd = new MySqlCommand("Select Code,Name,LifeExpectancy,GNP,flg from country where Name REGEXP '" + A + "'", connection);
    MySqlDataReader dataReader = cmd.ExecuteReader();
    while (dataReader.Read())
    {
        BitmapImage bi = new BitmapImage();

        co = dataReader["Code"].ToString();
        na = dataReader["Name"].ToString();
        le = dataReader["LifeExpectancy"].ToString();
        gn = dataReader["GNP"].ToString();
        Byte[] bindata = (Byte[])dataReader["flg"];
        MemoryStream strm = new MemoryStream();
        strm.Write(bindata, 0, bindata.Length);
        strm.Position = 0;
        System.Drawing.Image img = System.Drawing.Image.FromStream(strm); 
        bi.BeginInit();
        MemoryStream ms = new MemoryStream();
        img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
        ms.Seek(0, SeekOrigin.Begin);
        bi.StreamSource = ms; 
        bi.EndInit();
        dt.Rows.Add(co, na, le, gn, bi);
        dataGridCustomers.ItemsSource = dt.DefaultView;
    }
}
catch (MySqlException ex)
{
       MessageBox.Show(ex.ToString());
}

编辑:在上面的代码中,System.Drawing.Image完全是多余的。您应该直接从字节数组创建BitmapImage,如下所示:

var bindata = (byte[])dataReader["flg"];
var bi = new BitmapImage();

using (var stream = new MemoryStream(bindata))
{
    bi.BeginInit();
    bi.CacheOption = BitmapCacheOption.OnLoad;
    bi.StreamSource = stream;
    bi.EndInit();
}
© www.soinside.com 2019 - 2024. All rights reserved.