📄 imagesdialogcs.aspx.cs
字号:
using System;
using System.Data;
using System.Data.OleDb;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.IO;
namespace Telerik.EditorExamplesCSharp.Editor.Examples.DBImages
{
/// <summary>
/// The dialog containing the upload form, search form, and the images grid.
/// </summary>
public class ImagesDialog : System.Web.UI.Page
{
#region Private members
private string sortedBy, sortedOrder;
#endregion
#region Child controls
protected Button btnUpload;
protected DataGrid gridCurrentImages;
protected Literal ltMessage;
protected HtmlTableRow htmlRowMessage;
protected System.Web.UI.WebControls.TextBox txtSearchCriteria;
protected System.Web.UI.WebControls.Button btnSearch;
protected HtmlInputFile htmlIFImage;
#endregion
#region Database related methods
/// <summary>
/// Reads all the data to be displayed in the datagrid
/// </summary>
/// <returns></returns>
private DataTable GetCurrentImagesFromDB()
{
return GetCurrentImagesFromDB(null);
}
/// <summary>
/// Reads the data to be displayed in the datagrid by specified search criteria
/// </summary>
/// <returns></returns>
private DataTable GetCurrentImagesFromDB(string Criteria)
{
OleDbConnection conn = new OleDbConnection(DefaultCS.ConnectionString);
conn.Open();
OleDbCommand command = new OleDbCommand("SELECT FileName, TimeAdded, TimeLastModified FROM Images WHERE (FileName LIKE '%' + @Criteria + '%') OR (@Criteria = '')", conn);
if(Criteria == null)
{
Criteria = "";
}
command.Parameters.Add(new OleDbParameter("@Criteria", Criteria));
OleDbDataAdapter adapter = new OleDbDataAdapter(command);
DataTable toReturn = new DataTable();
try
{
adapter.Fill(toReturn);
}
catch(OleDbException ex)
{
Response.Write("An error occured during the Database request. MS Jet Engine Server answered: " + ex.Message);
}
finally
{
conn.Close();
}
return toReturn;
}
/// <summary>
/// Saves the information for a newly uploaded image file to the database
/// that includes:
/// FileName, Image, Thumbnail, Time first uploaded, Time last modified
/// The last two attributes are being set by the stored procedure
/// </summary>
/// <param name="image"></param>
/// <param name="FileName"></param>
/// <returns></returns>
private bool SaveImageToDb(System.Drawing.Image image, string FileName)
{
OleDbConnection conn = new OleDbConnection(DefaultCS.ConnectionString);
conn.Open();
//First, delete if there is such an image:
OleDbCommand command = new OleDbCommand("Select COUNT(FileName) FROM Images WHERE FileName = ?", conn);
OleDbParameter paramFileName = new OleDbParameter("@FileName", FileName);
command.CommandType = CommandType.Text;
//Assign the parameters to the command
command.Parameters.Add(paramFileName);
bool success = true;
object filesCount = null;
try
{
filesCount = command.ExecuteScalar();
}
catch (OleDbException odbex)
{
success = false;
}
finally
{
conn.Close();
}
if (filesCount != null)
{
OleDbParameter paramThumbnail = new OleDbParameter("@Thumbnail", GetByteArray(GetThumbnail(image)));
OleDbParameter paramFullImage = new OleDbParameter("@FullImage", GetByteArray(image));
command.Parameters.Clear();
command.Parameters.Add(paramThumbnail);
command.Parameters.Add(paramFullImage);
command.Parameters.Add(paramFileName);
command.Parameters[0].OleDbType = OleDbType.Binary;
command.Parameters[1].OleDbType = OleDbType.Binary;
if ((int)filesCount > 0)
{
command.CommandText = "UPDATE Images SET Thumbnail = ?, FullImage = ?, TimeLastModified = NOW() WHERE FileName = ?";
}
else
{
command.CommandText = "INSERT INTO Images (Thumbnail, FullImage, FileName, TimeAdded, TimeLastModified) VALUES ( ?, ?, ?, NOW(), NOW())";
}
conn.Open();
try
{
command.ExecuteNonQuery();
}
catch(OleDbException)
{
success = false;
}
finally
{
conn.Close();
}
}
else
{
success = false;
}
return success;
}
/// <summary>
/// Deletes the information of a file with a given filename
/// </summary>
/// <param name="FileName"></param>
/// <returns></returns>
private bool DeleteImage(string FileName)
{
OleDbConnection conn = new OleDbConnection(DefaultCS.ConnectionString);
conn.Open();
OleDbCommand command = new OleDbCommand("DELETE FROM Images WHERE FileName LIKE ?", conn);
command.Parameters.Add("@FileName", FileName);
bool success = true;
try
{
command.ExecuteNonQuery();
}
catch(OleDbException)
{
success = false;
}
finally
{
conn.Close();
}
return success;
}
#endregion
#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
InitializeComponent();
base.OnInit(e);
}
private void InitializeComponent()
{
this.btnUpload.Click += new System.EventHandler(this.btnUpload_Click);
this.btnSearch.Click += new System.EventHandler(this.btnSearch_Click);
this.gridCurrentImages.ItemCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(this.gridCurrentImages_OnItemCommand);
this.gridCurrentImages.PageIndexChanged += new System.Web.UI.WebControls.DataGridPageChangedEventHandler(this.gridCurrentImages_OnPageIndexChanged);
this.gridCurrentImages.SortCommand += new System.Web.UI.WebControls.DataGridSortCommandEventHandler(this.gridCurrentImages_OnSortCommand);
this.gridCurrentImages.ItemDataBound += new System.Web.UI.WebControls.DataGridItemEventHandler(this.gridCurrentImages_OnItemDataBound);
this.gridCurrentImages.SelectedIndexChanged += new System.EventHandler(this.gridCurrentImages_SelectedIndexChanged);
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
#region Other methods
/// <summary>
/// Checks where to show the error row and sets a message to a literal
/// </summary>
/// <param name="Message"></param>
private void SetMessage(string Message)
{
if((Message == "") || (Message == null))
{
htmlRowMessage.Visible = false;
ltMessage.Text = Message;
}
else
{
htmlRowMessage.Visible = true;
ltMessage.Text = Message;
}
}
/// <summary>
/// Gets the thumbnail of an image
/// </summary>
/// <param name="image"></param>
/// <returns></returns>
private System.Drawing.Image GetThumbnail(System.Drawing.Image image)
{
int height = DefaultCS.ThumbsHeight;
int width = DefaultCS.ThumbsWidth;
System.Drawing.Image.GetThumbnailImageAbort myCallback = new System.Drawing.Image.GetThumbnailImageAbort(MyThumbnailCallBack);
return image.GetThumbnailImage(width, height, myCallback, IntPtr.Zero);
}
/// <summary>
/// A Dummy method, needed by the GetThumbnail method
/// </summary>
/// <returns></returns>
private bool MyThumbnailCallBack()
{
return false;
}
/// <summary>
/// Gets the data images data from the database and binds the grid
/// </summary>
private void BindImagesGrid()
{
DataView dv = new DataView(GetCurrentResult());
GetSortFields();
if((sortedBy != null) && (sortedBy != ""))
{
dv.Sort = sortedBy + " " + sortedOrder;
}
gridCurrentImages.DataSource = dv;
if (gridCurrentImages.PageSize * gridCurrentImages.CurrentPageIndex >= dv.Count &&
gridCurrentImages.CurrentPageIndex > 0)
{
gridCurrentImages.CurrentPageIndex -= 1;
}
gridCurrentImages.DataBind();
}
/// <summary>
/// Converts an image object to a byte array, easily insertable to the database
/// </summary>
/// <param name="image"></param>
/// <returns></returns>
private byte[] GetByteArray(System.Drawing.Image image)
{
MemoryStream ms = new MemoryStream();
image.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
return ms.ToArray();
}
/// <summary>
/// Searches in the session for the stored result and returns it if found, else
/// returns the full data table
/// </summary>
/// <returns></returns>
private DataTable GetCurrentResult()
{
if(Session["CurrentResult"] == null)
{
return GetCurrentImagesFromDB();
}
else
{
return (DataTable)Session["CurrentResult"];
}
}
/// <summary>
/// Stores the given result in the Session
/// </summary>
/// <param name="result"></param>
private void StoreCurrentResult(DataTable result)
{
Session["CurrentResult"] = result;
}
/// <summary>
/// Searches for the stored sort values in the viewstate and if finds them,
/// returns their respective values
/// </summary>
private void GetSortFields()
{
if(ViewState["SortedBy"] != null)
{
sortedBy = ViewState["SortedBy"].ToString();
if(ViewState["SortedOrder"] != null)
{
sortedOrder = ViewState["SortedOrder"].ToString();
}
else
{
sortedOrder = "ASC";
}
}
else
{
sortedBy = null;
sortedOrder = null;
}
}
/// <summary>
/// Sets the global sorting members to the given new ones, and also
/// stores them in the viewstate for use when sorting
/// </summary>
/// <param name="SortedBy"></param>
/// <param name="SortedOrder"></param>
private void SetSortFields(string SortedBy, string SortedOrder)
{
sortedBy = SortedBy;
sortedOrder = SortedOrder;
ViewState["SortedBy"] = sortedBy;
ViewState["SortedOrder"] = sortedOrder;
}
/// <summary>
/// Switches the sorting fields, returns if the pageIndex should be set to 0
/// </summary>
/// <returns></returns>
private bool SwitchSortFields(string newSortBy)
{
bool initPaging = false;
GetSortFields();
if((sortedBy != null) && (sortedBy.ToLower() == newSortBy.ToLower()))
{
if(sortedOrder == "DESC")
{
sortedOrder = "ASC";
}
else
{
sortedOrder = "DESC";
}
SetSortFields(sortedBy, sortedOrder);
}
else
{
initPaging = true;
SetSortFields(newSortBy, "ASC");
}
return initPaging;
}
#endregion
#region Eventhandlers
private void Page_Load(object sender, System.EventArgs e)
{
if(!Page.IsPostBack)
{
htmlRowMessage.Visible = false;
//init the search results in the session when opening for the first time
StoreCurrentResult(GetCurrentImagesFromDB());
BindImagesGrid();
}
}
private void btnUpload_Click(object sender, System.EventArgs e)
{
//Check if the file is not empty
if(htmlIFImage.PostedFile == null)
{
SetMessage("No file was uploaded");
return;
}
if((htmlIFImage.PostedFile.FileName == "") || (htmlIFImage.PostedFile.InputStream.Length == 0))
{
SetMessage("No file was uploaded");
return;
}
bool errorOccured = false;
System.Drawing.Image image;
try
{
image = System.Drawing.Image.FromStream(htmlIFImage.PostedFile.InputStream);
}
catch(Exception)
{
errorOccured = true;
SetMessage("File was not an image");
return;
}
errorOccured = SaveImageToDb(image, Path.GetFileName(htmlIFImage.PostedFile.FileName));
if(!errorOccured)
{
SetMessage("A database error occured");
return;
}
else
{
SetMessage("");
StoreCurrentResult(GetCurrentImagesFromDB());
BindImagesGrid();
}
}
private void gridCurrentImages_OnItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
{
if((e.Item.ItemType == ListItemType.Item) || (e.Item.ItemType == ListItemType.AlternatingItem))
{
//Get the current binded data
DataRowView row = (DataRowView)e.Item.DataItem;
//Assign thumbnail image properties
HtmlImage htmlImgThumbnail = (HtmlImage)e.Item.FindControl("htmlImgThumbnail");
if(htmlImgThumbnail != null)
{
htmlImgThumbnail.Alt = String.Format(htmlImgThumbnail.Alt, row["FileName"]);
htmlImgThumbnail.Src = String.Format(htmlImgThumbnail.Src, row["FileName"]);
}
//Assign image selecting Html Anchor's properties (calls the javascript function)
HtmlAnchor htmlAnchorImageSelector = (HtmlAnchor)e.Item.FindControl("htmlAnchorImageSelector");
if(htmlAnchorImageSelector != null)
{
htmlAnchorImageSelector.HRef = String.Format(htmlAnchorImageSelector.HRef, row["FileName"]);
}
//Assign a command argument to the delete button, so that later 'knows' which file to delete
LinkButton lbDelete = (LinkButton)e.Item.FindControl("lbDelete");
if(lbDelete != null)
{
lbDelete.CommandArgument = row["FileName"].ToString();
}
}
}
private void gridCurrentImages_OnItemCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
switch(e.CommandName)
{
case "Delete":
DeleteImage(e.CommandArgument.ToString());
StoreCurrentResult(GetCurrentImagesFromDB());
BindImagesGrid();
break;
}
}
private void btnSearch_Click(object sender, System.EventArgs e)
{
StoreCurrentResult(GetCurrentImagesFromDB(txtSearchCriteria.Text));
BindImagesGrid();
}
private void gridCurrentImages_OnPageIndexChanged(object source, System.Web.UI.WebControls.DataGridPageChangedEventArgs e)
{
gridCurrentImages.CurrentPageIndex = e.NewPageIndex;
BindImagesGrid();
}
private void gridCurrentImages_OnSortCommand(object source, System.Web.UI.WebControls.DataGridSortCommandEventArgs e)
{
GetSortFields();
if(SwitchSortFields(e.SortExpression))
{
gridCurrentImages.CurrentPageIndex = 0;
}
SetSortFields(sortedBy, sortedOrder);
BindImagesGrid();
}
#endregion
private void gridCurrentImages_SelectedIndexChanged(object sender, System.EventArgs e)
{
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -