ASP.NET C # GridView - переменное количество столбцов и миниатюра изображения - PullRequest
1 голос
/ 22 сентября 2011

Используя GridView1.DataBind(); и AutoGenerateColumns="true" как найти конкретный столбец и вместо URL отобразить миниатюру изображения с этого URL?

GridView создается в результате запроса SQL, который может возвращать от 2 до 10 столбцов (один из которых может быть URL-адресом изображения).

Для миниатюры я считаю, что можно использовать image.GetThumbnailImage(), но где его использовать в такой ситуации?


Генерация SQL-запроса:

if (CheckBoxUser.Checked) search_fields += "UserName";
if (CheckBoxDate.Checked) search_fields += ",EventDate";
...
if  (CheckBoxImageUrl.Checked) search_fields += ",ImageUrl";

SqlConnection conn = new SqlConnection(connectionString);
string select = "SELECT " + search_fields + " FROM TableName";
SqlDataAdapter DataCommand = new SqlDataAdapter(select, conn);
DataCommand.Fill(ds);     
GridView1.DataSource = ds.Tables[0].DefaultView;
GridView1.DataBind();

GridView1 это просто:

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="True">
    <HeaderStyle CssClass="header_grid" />               
</asp:GridView>

Нет столбцов, объявленных вручную, так как мы не знаем, сколько столбцов пользователь хочет просмотреть. Но если он помечает столбец «ImageUrl», то вместо сетевого пути к файлу (\ somePc \ path \ file.jpg) ему нужно увидеть эскиз этого изображения в GridView.

1 Ответ

1 голос
/ 22 сентября 2011

Если вам известен тип вашего источника данных и имя столбца, содержащего URL-адрес изображения, вы можете использовать событие RowDataBound , например:

Примечание: Это будет работать, только если вы не используете другие столбцы с шаблонами.

gridView1.RowDataBound += new GridViewRowEventHandler(gridView1_RowDataBound);

...

void gridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        DataView dataSource = (DataView)gridView1.DataSource;

        DataColumn imageUrlColumn = dataSource.Table.Columns["ImageUrl"];
        if (imageUrlColumn != null)
        {
            int index = imageUrlColumn.Ordinal;

            DataControlFieldCell cell = (DataControlFieldCell)e.Row.Controls[index];
            string imageUrl = cell.Text;

            cell.Text = GenerateThumbnailUrl(imageUrl);
        }
    }
}
...