【问题标题】:C# WinForms & SQL Server : how to render image in gridview using stored procedureC# WinForms 和 SQL Server:如何使用存储过程在 gridview 中呈现图像
【发布时间】:2019-09-20 11:21:56
【问题描述】:

enter image description here如何使用存储过程在Gridview中渲染图像?

目前在 gridview 中显示的是图像或文件夹的路径(位置),但我需要渲染图像本身 - 第一列必须成为图像列。这适用于使用 C# 的 Windows 窗体。感谢您的帮助。

image showing image paths instead of actual images

void FillDataGridView_Main()
{
    if (sqlCon.State == ConnectionState.Closed)
        sqlCon.Open();

    SqlDataAdapter sqlDA = new SqlDataAdapter("[sp_selectTop10CycleTime]", sqlCon);
    sqlDA.SelectCommand.CommandType = CommandType.StoredProcedure;

    sqlDA.SelectCommand.Parameters.AddWithValue("@date", DateTime.Now.ToShortDateString());

    DataTable dataTbl = new DataTable();
    sqlDA.Fill(dataTbl);

    dgvNextCycleTime.DataSource = dataTbl;

    sqlCon.Close();
}

现在使用下面给定的代码 :) 但是在使用计时器每1秒更新一次void FillDataGirdView_Main()时遇到另一个错误

 void FillDataGridView_Main()
    {
        if (sqlCon.State == ConnectionState.Closed)
            sqlCon.Open();
        SqlDataAdapter sqlDA = new SqlDataAdapter("[sp_selectTop10CycleTime]", sqlCon);
        sqlDA.SelectCommand.CommandType = CommandType.StoredProcedure;
        sqlDA.SelectCommand.Parameters.AddWithValue("@date", DateTime.Now.ToShortDateString());
        DataTable dataTbl = new DataTable();
        sqlDA.Fill(dataTbl);
        dgvNextCycleTime.DataSource = dataTbl;
        sqlCon.Close();

        int ImagePathIndex = 0; // assuming that the image path  column is 0 (See in your case) 
        dgvNextCycleTime.Columns[ImagePathIndex].Visible = false; // Make visibility for the path = false

        DataGridViewImageColumn ImageColunm = new DataGridViewImageColumn();
        ImageColunm.HeaderText = "Image";
        ImageColunm.Name = "ImageName";
        ImageColunm.ImageLayout = DataGridViewImageCellLayout.Normal;
        ImageColunm.Image = null;
        dgvNextCycleTime.Columns.Insert(1, ImageColunm); // Add the new colunm to the grid 

        // Add the image to the new column in the grid
        foreach (DataGridViewRow row in dgvNextCycleTime.Rows)
        {
            Image img = Image.FromFile(row.Cells[ImagePathIndex].Value.ToString());
            DataGridViewImageCell cell = row.Cells["ImageName"] as DataGridViewImageCell;
            cell.Value = img;
        }

【问题讨论】:

    标签: c# sql-server winforms stored-procedures


    【解决方案1】:

    您需要为图像添加新列并使图像路径可见性 = false

    所以你的代码会是这样的:-

    sqlCon = new SqlConnection(connectionString);
            if (sqlCon.State == ConnectionState.Closed)
                sqlCon.Open();
    
            SqlDataAdapter sqlDA = new SqlDataAdapter("[sp_selectTop10CycleTime]", sqlCon);
            sqlDA.SelectCommand.CommandType = CommandType.StoredProcedure;
    
            sqlDA.SelectCommand.Parameters.AddWithValue("@date", DateTime.Now.ToShortDateString());
    
    
            DataTable dataTbl = new DataTable();
    
    
            sqlDA.Fill(dataTbl);
    
            dgvNextCycleTime.DataSource = dataTbl;
    
            sqlCon.Close();
            //////////////////////////////// New code ////////////////////////////
            int ImagePathIndex = 0; // assuming that the image path  column is 0 (See in your case) 
            dgvNextCycleTime.Columns[ImagePathIndex].Visible = false; // Make visibility for the path = false
    
            DataGridViewImageColumn ImageColunm = new DataGridViewImageColumn();
            ImageColunm.HeaderText = "Image";
            ImageColunm.Name = "ImageName";
            ImageColunm.ImageLayout = DataGridViewImageCellLayout.Stretch;
            ImageColunm.Image = null;
            dgvNextCycleTime.Columns.Add(ImageColunm); // Add the new colunm to the grid 
    
    
            // Add the image to the new column in the grid
            foreach (DataGridViewRow row in dgvNextCycleTime.Rows)
            {
    
                Image img = Image.FromFile(row.Cells[ImagePathIndex].Value.ToString());
                DataGridViewImageCell cell = row.Cells["ImageName"] as DataGridViewImageCell;
                cell.Value = img;
            }
    

    【讨论】:

    • 谢谢 Hassan Badry,我更新了问题。我在使用 TImer 时遇到错误,但没有定时器,它很流畅。请帮忙。
    • 我觉得是foreach循环遇到了问题?尝试调试,当循环结束并尝试再次启动循环时,指向 foreach 循环第一行的错误。希望你能帮我解决这个问题
    • 然后尝试从代码中删除此行:- DataGridViewImageColumn ImageColunm = new DataGridViewImageColumn(); ImageColunm.HeaderText = "图像"; ImageColunm.Name = "图像名称"; ImageColunm.ImageLayout = DataGridViewImageCellLayout.Normal; ImageColunm.Image = null; dgvNextCycleTime.Columns.Insert(1, ImageColunm);并将它们放入表单加载中
    • 应用了您的指示,但在指向 dgvNextCycleTime 的表单加载中提示错误。
    【解决方案2】:

    要实现您的目标,请将DataGridView 控件放在您的表单上并定义列。在我的示例中,有两列,其中第一列用于显示图像(列类型DataGridViewImageColumn),第二列是文本列(类型DataGridViewTextBoxColumn),如下图所示:

    在代码中,在您使用存储过程将数据加载到 DataTable 后,遍历行并在您的 dgvNextCycleTime 控件中创建这些行,如下所示:

    //this is my test data, you should start with foreach line
    DataTable dataTbl = new DataTable();
    dataTbl.Columns.Add("ImageColumn", typeof(string));
    dataTbl.Columns.Add("SecondColumn", typeof(string));
    
    dataTbl.Rows.Add(new string[] { @"c:\temp\img1.png", "some title" });
    dataTbl.Rows.Add(new string[] { @"c:\temp\img2.png", "some title2" });
    
    //here you need to go through every row in DataTable, create Image object from path
    foreach (DataRow row in dataTbl.Rows)
    {
        Image img = Image.FromFile(row[0].ToString()); //be sure you're getting path from correct column (first one in my example)
        dgvNextCycleTime.Rows.Add(new object[] { img, row[1].ToString() }); //second column, with some text
    }
    

    结果是:

    【讨论】:

    • 谢谢尼诺,这行得通。但我更新了问题..请帮忙。使用定时器每秒更新gridview,提示错误。谢谢
    • 我觉得是foreach循环遇到了问题?尝试调试,当循环结束并尝试再次启动循环时,指向 foreach 循环第一行的错误。希望你能帮我解决这个问题
    【解决方案3】:

    如果您已将路径保存到数据库中,您可以使用DataGridViewImageColumn' 和CellFormatting 事件来加载图像。

    您可以在此处查看页面最后一篇文章中的示例:

    https://social.msdn.microsoft.com/Forums/vstudio/en-US/9e676b21-fa8b-4e35-ba22-b7c7f9963593/image-retrieving-from-sql-to-data-gridview?forum=winformsdatacontrols

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多