C # WinForms & SQL Server: как визуализировать изображение в gridview с помощью хранимой процедуры - PullRequest
0 голосов
/ 20 сентября 2019

введите описание изображения здесь Как отобразить изображение в Gridview с помощью хранимой процедуры?

В настоящее время в виде сетки отображается путь (местоположение) изображения или папки, ноМне нужно визуализировать само изображение - этот первый столбец должен стать столбцом изображения.Это для Windows Forms, использующих C #.Спасибо за помощь.

изображение, показывающее пути к изображениям вместо реальных изображений

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 секунду пустое 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;
        }

Ответы [ 3 ]

0 голосов
/ 20 сентября 2019

Чтобы достичь цели, поместите элемент управления DataGridView в форму и определите столбцы.В моем примере есть два столбца, где первый используется для отображения изображения (тип столбца DataGridViewImageColumn), а второй - текстовый столбец (тип DataGridViewTextBoxColumn), как на этом изображении:

enter image description here

В коде после того, как вы использовали хранимую процедуру для загрузки данных в 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
}

и результат:

enter image description here

0 голосов
/ 20 сентября 2019

Вам нужно будет добавить новый столбец для изображения и сделать видимость пути к изображению = 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;
        }
0 голосов
/ 20 сентября 2019

Если вы сохранили путь в базе данных, вы можете использовать DataGridViewImageColumnCellFormatting событие для загрузки изображения.

Вы можете посмотреть образец в последнем посте на странице здесь:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...