C#WinForms&;SQL Server:如何使用存储过程在gridview中渲染图像
如何使用存储过程在Gridview中渲染图像 当前gridview中显示的是图像或文件夹的路径(位置),但我需要渲染图像本身-第一列必须成为图像列。这适用于使用C#的Windows窗体。谢谢你的帮助 现在使用以下给定代码:) 但是使用计时器每1秒更新一次void FillDataGirdView_Main()时会遇到另一个错误C#WinForms&;SQL Server:如何使用存储过程在gridview中渲染图像,c#,sql-server,winforms,stored-procedures,C#,Sql Server,Winforms,Stored Procedures,如何使用存储过程在Gridview中渲染图像 当前gridview中显示的是图像或文件夹的路径(位置),但我需要渲染图像本身-第一列必须成为图像列。这适用于使用C#的Windows窗体。谢谢你的帮助 现在使用以下给定代码:) 但是使用计时器每1秒更新一次void FillDataGirdView_Main()时会遇到另一个错误 如果已将路径保存到数据库中,则可以使用DataGridViewImageColumn”和CellFormatting事件加载图像 您可以在此处查看页面最后一篇文章中的示
如果已将路径保存到数据库中,则可以使用
DataGridViewImageColumn
”和CellFormatting
事件加载图像
您可以在此处查看页面最后一篇文章中的示例:
要实现您的目标,请在表单上放置
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
}
结果是:
您需要为图像添加新列,并使图像路径可见性=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我更新了问题。。我在使用计时器时遇到错误,但没有计时器,它很平滑。。请帮忙。我想在foreach循环中遇到了问题?尝试调试时,当循环结束并再次尝试启动循环时,指向foreach循环的第一行时出错。希望您能帮助我解决这个问题,请稍后尝试从代码中删除以下行:-DataGridViewImageColumn ImageColumn=new DataGridViewImageColumn();ImageColunm.HeaderText=“Image”;ImageColunm.Name=“ImageName”;ImageColunm.ImageLayout=DataGridViewImageCellLayout.Normal;ImageColunm.Image=null;dgvNextCycleTime.Columns.Insert(1,ImageColunm);然后将它们放在form load而不是应用您指示的,但formload中指向dgvNextCycleTime的错误提示。谢谢Nino,这正在工作。但是我更新了问题。。请帮忙。使用计时器每秒钟更新一次gridview,出现提示错误。谢谢我想在foreach循环中遇到了一个问题?尝试调试时,当循环结束并再次尝试启动循环时,指向foreach循环的第一行时出错。希望你能帮我解决这个问题
//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
}
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;
}