无法从c中的mysql数据库获得wpf datagrid中图像的多个结果#

yacmzcpb  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(354)

有了这段代码,我可以用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());
    }
vbopmzt1

vbopmzt11#

原因是您正在循环外创建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();
}

相关问题