팡이네

MVC4 Quick Tip #3–Removing the XML Formatter from ASP.Net Web API

In Global.asax add the line:

GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();

like so:

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();

    RegisterGlobalFilters(GlobalFilters.Filters);
    RegisterRoutes(RouteTable.Routes);

    BundleTable.Bundles.RegisterTemplateBundles();
    GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();
}


'C#' 카테고리의 다른 글

폴더 압축 (SharpZipLib 사용)  (0) 2017.11.28
ClosedXML 사용  (0) 2017.05.17
ASP.NET 엑셀 출력 스타일  (0) 2016.08.31
사진 이미지 관련 클래스  (0) 2016.04.14
오라클 BLOB 등록 및 조회  (0) 2016.04.14

* 특정 폴더에 있는 파일 압축
* ICSharpCode.SharpZipLib.dll 사용
* folderPath : 폴더 경로(서버 물리 경로)

	public void DownloadZipFile(string folderPath)
	{
		if (Directory.Exists(folderPath))
		{
			var zipFilePath = string.Format("{0}.zip", folderPath);

			//-----------------------------------
			//파일 압축
			//-----------------------------------
			try
			{
				var files = Directory.GetFiles(folderPath);

				// 'using' statements guarantee the stream is closed properly which is a big source
				// of problems otherwise.  Its exception safe as well which is great.
				using (ZipOutputStream s = new ZipOutputStream(File.Create(zipFilePath)))
				{
					s.SetLevel(9); // 0 - store only to 9 - means best compression

					byte[] buffer = new byte[4096];

					foreach (string file in files)
					{
						// Using GetFileName makes the result compatible with XP
						// as the resulting path is not absolute.
						var entry = new ZipEntry(Path.GetFileName(file));

						// Setup the entry data as required.

						// Crc and size are handled by the library for seakable streams
						// so no need to do them here.

						// Could also use the last write time or similar for the file.
						entry.DateTime = DateTime.Now;
						s.PutNextEntry(entry);

						using (FileStream fs = File.OpenRead(file))
						{
							// Using a fixed size buffer here makes no noticeable difference for output
							// but keeps a lid on memory usage.
							int sourceBytes;
							do
							{
								sourceBytes = fs.Read(buffer, 0, buffer.Length);
								s.Write(buffer, 0, sourceBytes);
							} while (sourceBytes > 0);
						}
					}

					// Finish/Close arent needed strictly as the using statement does this automatically

					// Finish is important to ensure trailing information for a Zip file is appended.  Without this
					// the created file would be invalid.
					s.Finish();

					// Close is important to wrap things up and unlock the file.
					s.Close();
				}
			}
			catch
			{
				throw new Exception("파일을 압축하는 도중 오류가 발생하였습니다.");
			}

			//-----------------------------------
			//폴더 삭제
			//-----------------------------------
			try
			{
				Directory.Delete(folderPath, true);
			}
			catch
			{
				throw new Exception("압축폴더를 다운로드 하는 도중 오류가 발생하였습니다.");
			}

			//-----------------------------------
			//압축파일 다운로드
			//-----------------------------------
			try
			{
				this.DownloadZipFile(zipFilePath, true);
			}
			catch
			{
				throw new Exception("압축파일을 다운로드 하는 도중 오류가 발생하였습니다.");
			}
		}
	}

* DownloadZipFile() 서버의 압축파일(ZIP)을 다운로드한다.

	/// 
	/// 서버의 압축파일(ZIP)을 다운로드한다.
	/// 
	/// 서버 파일 경로
	/// 다운로드 후 파일 삭제여부
	public void DownloadZipFile(string filePath, bool deleteAfterDown)
	{
		var fileName = System.IO.Path.GetFileName(filePath);

		//한글 깨어짐 방지
		var saveFileName = HttpUtility.UrlEncode(fileName).Replace("+", "%20");

		var response = System.Web.HttpContext.Current.Response;
		
		//아래 방식을 사용하면 다운로드 후 압축파일이 깨어졌다는 메시지 표시
		/*
		response.ClearContent();
		response.Clear();
		response.ContentType = "application/zip";
		response.Charset = "utf-8";
		response.AddHeader("Content-Disposition", "attachment; filename=" + saveFileName + ";");
		response.TransmitFile(filePath);
		response.Flush();

		if (deleteAfterDown)
		{
			//파일 삭제
			var deleteFile = new System.IO.FileInfo(filePath);
			if (deleteFile.Exists)
			{
				System.IO.File.Delete(filePath);
			}
		}

		response.End();
		*/

		//---------------------------------------------
		//제네릭 처리기 사용
		//---------------------------------------------
		//Response.TransmitFile() 메소드 사용시 압축파일이 깨졌다는 메시지 표시
		response.Redirect(string.Format("~/DownloadZipFile.ashx?fileName={0}", saveFileName));
	}

* DownloadZipFile.ashx 파일 내용

<%@ WebHandler Language="C#" Class="DownloadZipFile" %>

using System;
using System.IO;
using System.Web;

public class DownloadZipFile : IHttpHandler
{
	public void ProcessRequest(HttpContext context)
	{
		var request = context.Request;
		var response = context.Response;
		var fileName = request.QueryString["fileName"];

		if (!string.IsNullOrEmpty(fileName))
		{
			var saveFileName = HttpUtility.UrlEncode(fileName).Replace("+", "%20");
			var fullPath = string.Format("{0}{1}", context.Server.MapPath(@"~/Download/"), fileName);	//다운로드 파일 경로
			
			response.ClearContent();
			response.Clear();
			response.ContentType = "application/zip";
			response.Charset = "utf-8";
			response.AddHeader("Content-Disposition", string.Format(@"attachment; filename=""{0}"";", saveFileName));
			response.TransmitFile(fullPath);
			response.Flush();

			//엑셀 파일 삭제
			var deleteFile = new FileInfo(fullPath);
			if (deleteFile.Exists)
			{
				File.Delete(fullPath);
			}
			
			response.End();
		}
		else
		{
			var script = "<script type='text/javascript'>alert('압축 파일을 찾을 수 없습니다.');history.back();</script>";
			response.Write(script);
			response.End();
		}
	}

	public bool IsReusable
	{
		get
		{
			return false;
		}
	}
}

ClosedXML 사용

C#2017. 5. 17. 15:42

* AddWorksheet() 새로운 워크시트를 만든다.

public IXLWorksheet AddWorksheet(XLWorkbook wb, string sheetName)
{
	var ws = wb.AddWorksheet(sheetName);
	ws.Style.Font.SetFontName("맑은 고딕");	//기본글꼴
	ws.Style.Font.SetFontSize(10);			//기본글꼴크기
	ws.Style.Alignment.Vertical = XLAlignmentVerticalValues.Center;	//세로맞춤: 가운데

	return ws;
}

* GetExcelColumn() 지정한 컬럼의 엑셀 컬럼문자를 가져온다.

public string GetExcelColumn(int columnIndex)
	{
		var colString = "";

		if (columnIndex > 26)
		{
			var surplus = columnIndex % 26; if (surplus == 0) surplus = 26;
			var quota = (columnIndex - surplus) / 26;

			//3글자 컬럼명
			if (quota > 26)
			{
				var surplus2 = quota % 26;
				var quota2 = (quota - surplus2) / 26;

				colString = string.Format("{0}{1}{2}", Convert.ToChar(64 + quota2), Convert.ToChar(64 + surplus2), Convert.ToChar(64 + surplus));
			}
			//2글자 컬럼명
			else
			{
				colString = string.Format("{0}{1}", Convert.ToChar(64 + quota), Convert.ToChar(64 + surplus));
			}
		}
		else
		{
			colString = string.Format("{0}", Convert.ToChar(64 + columnIndex));
		}

		return colString;
	}

* AddExcelCell() 지정한 셀에 숫자값을 표시한다.

public IXLCell AddExcelCell(IXLWorksheet ws, int row, int col, int value, string bgColor
						, bool bold, XLAlignmentHorizontalValues hAlign)
{
	var cell = ws.Cell(row, col);
	cell.SetValue(value);
	cell.DataType = XLCellValues.Number;
	cell.Style.NumberFormat.Format = "#,##0;(#,##0);-";
	cell.Style.Alignment.Horizontal = hAlign;
	cell.Style.Alignment.Vertical = XLAlignmentVerticalValues.Center;
	cell.Style.Border.OutsideBorder = XLBorderStyleValues.Thin;
	if (bold) cell.Style.Font.Bold = true;
	if (!string.IsNullOrEmpty(bgColor)) cell.Style.Fill.BackgroundColor = XLColor.FromHtml(bgColor);

	return cell;
}

* AddExcelCell() 지정한 셀에 문자열을 표시한다.

public IXLCell AddExcelCell(IXLWorksheet ws, int row, int col, string value, string bgColor, bool bold
						, XLAlignmentHorizontalValues hAlign, XLBorderStyleValues outsideBorder)
{
	var cell = ws.Cell(row, col).SetValue(value);
	cell.DataType = XLCellValues.Text;
	cell.Style.Alignment.Horizontal = hAlign;
	cell.Style.Alignment.Vertical = XLAlignmentVerticalValues.Center;
	cell.Style.Border.OutsideBorder = outsideBorder;
	if (bold) cell.Style.Font.Bold = true;
	if (!string.IsNullOrEmpty(bgColor)) cell.Style.Fill.BackgroundColor = XLColor.FromHtml(bgColor);

	return cell;
}

* AddExcelCell() 지정한 셀에 문자열을 표시하고 병합한다.

public IXLRange AddExcelCell(IXLWorksheet ws, int row, int col, int rowSpan, int colSpan, string value, string bgColor, int width)
{
	var endRow = (rowSpan > 1) ? row + rowSpan - 1 : row;
	var endCol = (colSpan > 1) ? col + colSpan - 1 : col;

	var rg = ws.Range(row, col, endRow, endCol);
	rg.Merge();
	rg.Cell(1, 1).SetValue(value);
	rg.DataType = XLCellValues.Text;
	rg.Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center;
	rg.Style.Alignment.Vertical = XLAlignmentVerticalValues.Center;
	rg.Style.Border.OutsideBorder = XLBorderStyleValues.Thin;
	if (!string.IsNullOrEmpty(bgColor)) rg.Style.Fill.BackgroundColor = XLColor.FromHtml(bgColor);
	if (width > 0) rg.FirstCell().WorksheetColumn().Width = width;

	return rg;
}

public IXLRange AddExcelCell(IXLWorksheet ws, int row, IXLRange range, int rowSpan, int colSpan, string value, string bgColor, int width)
{
	var col = range.Cell(1, 1).WorksheetColumn().ColumnNumber() + range.ColumnCount();
	var endRow = (rowSpan > 1) ? row + rowSpan - 1 : row;
	var endCol = (colSpan > 1) ? col + colSpan - 1 : col;

	var rg = ws.Range(row, col, endRow, endCol);
	rg.Merge();
	rg.Cell(1, 1).SetValue(value);
	rg.DataType = XLCellValues.Text;
	rg.Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center;
	rg.Style.Alignment.Vertical = XLAlignmentVerticalValues.Center;
	rg.Style.Border.OutsideBorder = XLBorderStyleValues.Thin;
	if (!string.IsNullOrEmpty(bgColor)) rg.Style.Fill.BackgroundColor = XLColor.FromHtml(bgColor);
	if (width > 0) rg.FirstCell().WorksheetColumn().Width = width;

	return rg;
}

* AddExcelFormularCell() 지정한 셀에 엑셀 수식을 표시한다.

public IXLCell AddExcelFormularCell(IXLWorksheet ws, int row, int col, string formular, string bgColor, bool bold, string numberFormat)
{
	var cell = ws.Cell(row, col);
	if (!string.IsNullOrEmpty(formular))
	{
		cell.DataType = XLCellValues.Number;
		if (!string.IsNullOrEmpty(numberFormat)) cell.Style.NumberFormat.Format = numberFormat;
		cell.SetFormulaA1(formular);
	}

	cell.Style.Alignment.Vertical = XLAlignmentVerticalValues.Center;
	cell.Style.Border.OutsideBorder = XLBorderStyleValues.Thin;
	if (bold) cell.Style.Font.Bold = true;
	if (!string.IsNullOrEmpty(bgColor)) cell.Style.Fill.BackgroundColor = XLColor.FromHtml(bgColor);

	return cell;
}

* DownloadExcel() 서버의 엑셀 파일을 다운로드한다.

	/// 
	/// 서버의 엑셀 파일을 다운로드한다.
	///		다운로드 후에는 서버의 엑셀 파일을 삭제한다.
	/// 
	/// 실제 서버 물리 경로
	/// 엑셀 파일명
	public void DownloadExcel(string filePath, string fileName)
	{
		//한글 깨어짐 방지
		var saveFileName = HttpUtility.UrlEncode(fileName).Replace("+", "%20");
		//var fullPath = filePath + fileName;

		var response = System.Web.HttpContext.Current.Response;

		//---------------------------------------------------------------------
		//엑셀 파일 다운로드
		//---------------------------------------------------------------------
		//서버의 엑셀 파일 다운로드 후 몇 바이트 늘어남 -> 엑셀 열기 선택 시 복구 메시지 표시
		//---------------------------------------------------------------------
		//response.ClearContent();
		//response.Clear();
		//response.Charset = "utf-8";
		//response.ContentEncoding = System.Text.Encoding.GetEncoding("utf-8");
		////response.ContentType = "application/vnd.msexcel";
		//response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
		//response.AddHeader("Content-Disposition", string.Format(@"attachment; filename=""{0}"";", saveFileName));
		////response.TransmitFile(Server.MapPath("/" + fileName));
		//response.TransmitFile(fullPath);
		//response.Flush();

		//엑셀 파일 삭제
		//var deleteFile = new System.IO.FileInfo(fullPath);
		//if (deleteFile.Exists)
		//{
		//	System.IO.File.Delete(fullPath);
		//}

		//response.End();

		//---------------------------------------------
		//제네릭 처리기 사용
		//---------------------------------------------
		//열기 선택 시 엑셀 파일이 읽기 전용으로 열림
		//---------------------------------------------
		response.Redirect(string.Format("~/DownloadExcelFile.ashx?fileName={0}", saveFileName));
	}

* DownloadExcelFile.ashx 파일 내용

<%@ WebHandler Language="C#" Class="DownloadExcelFile" %>

using System;
using System.IO;
using System.Web;

public class DownloadExcelFile : IHttpHandler
{
	public void ProcessRequest(HttpContext context)
	{
		var request = context.Request;
		var response = context.Response;
		var fileName = request.QueryString["fileName"];

		if (!string.IsNullOrEmpty(fileName))
		{
			var saveFileName = HttpUtility.UrlEncode(fileName).Replace("+", "%20");
			var fullPath = string.Format("{0}{1}", context.Server.MapPath(@"~/Download/"), fileName);	//다운로드 경로
			
			response.ClearContent();
			response.Clear();
			response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
			response.AddHeader("Content-Disposition", string.Format(@"attachment; filename=""{0}"";", saveFileName));
			response.TransmitFile(fullPath);
			response.Flush();

			//엑셀 파일 삭제
			var deleteFile = new FileInfo(fullPath);
			if (deleteFile.Exists)
			{
				File.Delete(fullPath);
			}
			
			response.End();
		}
		else
		{
			var script = "<script type='text/javascript'>alert('엑셀 파일을 찾을 수 없습니다.');history.back();</script>";
			response.Write(script);
			response.End();
		}
	}

	public bool IsReusable
	{
		get
		{
			return false;
		}
	}
}

※ 사용방법

using(var wb = new new XLWorkbook())
{
	var ws = AddWorksheet(wb, "Test Sheet");

	var row = 1;
	var col = 1;
	for (var i = 0; i < list.Length; i++)
	{
		col = 1;

		AddExcelCell(ws, row, col++, list[i]["COL1"].ToString());
		AddExcelCell(ws, row, col++, list[i]["COL2"].ToString());

		row++;
	}
	
	ws.Columns().AdjustToContents();		//열 너비 자동설정(데이터양이 많을 경우 속도가 매우 느려짐)
	wb.SaveAs(@"d:\\example.xlsx");		//서버의 지정한 경로에 저장

	DownloadExcel(@"d:\\example.xlsx");	//서버의 경로에 저장되므로 사용자는 다운로드 필요
}
※ 주의사항
ws.Columns().AdjustToContents();
열 너비 자동설정하는 명령어인데 데이터양이 조금이라도 많을 경우 속도가 매우 느려지므로 조심해서 사용하자.

1. 기본 '텍스트 줄 바꿈' 속성 제외

기본 엑셀 출력 시 모든 셀에 '텍스트 줄 바꿈' 속성이 설정된다.

이를 방지하려면 아래와 같이 스타일을 설정한다.


<style type="text/css">

td { white-space:nowrap; }

</style>



2. 같은 셀에 2줄 표시

만약 특정 셀에서 같은 셀에 2줄 이상을 표시하고 싶을 때가 있다.

이럴 경우에는 아래와 같이 스타일을 설정한다.


<style type="text/css">

br { mso-data-placement:same-cell; }

</style>


Reponse.Write("<td>이번 셀에서는<br/>이 줄은 다음 줄에 표시</td>");


결과


이번 셀에서는

이 줄은 다음 줄에 표시



3. 기본 '텍스트 줄 바꿈' 속성 제외와 같은 셀 2줄 표시를 동시에 하고 싶은 경우

아래와 같이 스타일을 설정한다.


<style type="text/css">

td { white-space:nowrap; }

br { mso-data-placement:same-cell; }

.same { white-space:normal; }

</style>


Reponse.Write("<td>이번 셀에서는<br/>한 줄에 표시</td>");

Reponse.Write(@"<td class=""same"">이번 셀에서는<br/>이 줄은 다음 줄에 표시</td>");


결과


이번 셀에서는한 줄에 표시


이번 셀에서는

이 줄은 다음 줄에 표시



같은 셀에 2줄 이상 표시하려면 '텍스트 줄 바꿈' 속성이 설정되어야 하므로

원하는 셀에 same css를 설정하여 같은 셀에 표시할 수 있도록 해준다.



4. 숫자 형식 지정(자릿점 표시)

원하는 셀에 다음과 같이 스타일을 지정한다.


//number가 문자열인 경우에도 강제 지정

Response.Write(string.Format(@"<td style=""mso-number-format:'#,###';"">{0}</td>", number));


또는 


//number가 숫자형식인 경우만 제대로 표시

Response.Write(string.Format("<td>{0:N0}"</td>, number));



5. 강제 문자열 형식 지정(숫자도 문자처럼 표시)


Response.Write(string.Format(@"<td style=""mso-number-format:'@';"">{0}</td>", string));



6. 한글 인코딩 설정


Response.Charset = "UTF-8";

Response.ContentEncoding = System.Text.Encoding.GetEncoding("utf-8");


/// 
/// 사진 정보
/// 
public class PhotoInfo
{
	private int maxWidth = 200, maxHeight = 267;
	private int orgWidth = 0, orgHeight = 0;
	private int width = 0, height = 0;
	private bool portraitMode = false;
	private string base64String = null;

	/// 
	/// 사진 정보
	/// 
	public PhotoInfo()
	{

	}

	/// 
	/// 사진 정보
	/// 
	/// 
	public PhotoInfo(MemoryStream ms)
	{
		this.base64String = "data:image/jpg;base64," + Convert.ToBase64String(ms.ToArray());

		System.Drawing.Image img = System.Drawing.Image.FromStream(ms);
		this.orgWidth = img.Width;
		this.orgHeight = img.Height;

		this.portraitMode = (img.Height - img.Width) > 0;

		//세로가 긴 사진인 경우
		if (this.portraitMode)
		{
			if (this.orgHeight > this.maxHeight)
			{
				this.height = this.maxHeight;
				var ratio = (this.maxHeight * 1.0) / (this.orgHeight * 1.0);
				this.width = (int)Math.Round(this.orgWidth * ratio);
				if (this.width > maxWidth)
				{
					this.width = maxWidth;
					ratio = (this.maxWidth * 1.0) / (this.orgWidth * 1.0);
					this.height = (int)Math.Round(this.orgHeight * ratio);
				}
			}
			else
			{
				this.height = this.orgHeight;
				this.width = this.orgWidth;
				if (this.width > maxWidth)
				{
					this.width = maxWidth;
					var ratio = (this.maxWidth * 1.0) / (this.orgWidth * 1.0);
					this.height = (int)Math.Round(this.orgHeight * ratio);
				}
			}
		}
		//가로가 긴 사진인 경우(LandscapeMode)
		else
		{
			if (this.orgWidth > this.maxWidth)
			{
				this.width = this.maxWidth;
				var ratio = (this.maxWidth * 1.0) / (this.orgWidth * 1.0);
				this.height = (int)Math.Round(this.orgHeight * ratio);
				if (this.height > maxHeight)
				{
					this.height = maxHeight;
					ratio = (this.maxHeight * 1.0) / (this.orgHeight * 1.0);
					this.width = (int)Math.Round(this.orgWidth * ratio);
				}
			}
			else
			{
				this.width = this.orgWidth;
				this.height = this.orgHeight;
				if (this.height > maxHeight)
				{
					this.height = maxHeight;
					var ratio = (this.maxHeight * 1.0) / (this.orgHeight * 1.0);
					this.width = (int)Math.Round(this.orgWidth * ratio);
				}
			}
		}
	}

	/// 
	/// 사진 최대 너비
	/// 
	public int MaxWidth { get { return maxWidth; } }
	/// 
	/// 사진 최대 높이
	/// 
	public int MaxHeight { get { return maxHeight; } }
	/// 
	/// 원본 사진 너비
	/// 
	public int OrgWidth { get { return this.orgWidth; } }
	/// 
	/// 원본 사진 높이
	/// 
	public int OrgHeight { get { return this.orgHeight; } }
	/// 
	/// 사진 너비
	/// 
	public int Width { get { return this.width; } }
	/// 
	/// 사진 높이
	/// 
	public int Height { get { return this.height; } }
	/// 
	/// 사진 가로방향여부
	/// 
	public bool PortraitMode { get { return this.portraitMode; } }
	/// 
	/// Base64 문자열
	/// 
	public string Base64String { get { return base64String; } }

	/// 
	/// 사진 정보 표시
	/// 
	/// 
	public void SetImage(Image image)
	{
		if (this.Base64String != null)
		{
			image.ImageUrl = this.Base64String;

			image.Height = this.Height;
			image.Width = this.width;
		}
	}
}

	if (!fileUpload.HasFile)
	{
		Alert("업로드할 사진이 없습니다.");
		Response.End();
	}
	
	var fileLength = fileUpload.PostedFile.ContentLength;
	if (fileLength > 1024000)
	{
		Alert("1MB 이하의 사진만 업로드 할 수 있습니다.");
		Response.End();
	}

	byte[] photoData = new byte[fileLength - 1];
	photoData = fileUpload.FileBytes;
	
	var userID = "";
	var msg = "FAIL";
	var query = "INSERT INTO PHOTO (USER_ID, PHOTO) VALUES ('{0}', :PHOTO)";
	//var query = "UPDATE PHOTO SET PHOTO = :PHOTO WHERE USER_ID = '{0}'";
	query = string.Format(query, userID);
	
	try
	{
		using (var conn = new OracleConnect(connStr))
		{
			var cmd = conn.CreateCommand();
			cmd.CommandType = CommandType.Text;
			cmd.CommandText = query;

			var param = cmd.Parameters.Add(":PHOTO", OracleType.Blob);
			param.Direction = ParameterDirection.Input;
			param.Value = photoData;

			var result = cmd.ExecuteNonQuery();

			if (result == 1)
			{
				msg = "SUCCESS";
			}
		}
	}
	catch (Exception ex)
	{
		throw ex;
	}


다른 프로젝트의 Resources.resx 파일의 리소스에 접근하기
try
{
	//시작 프로젝트에 있는 리소스일 경우는 GetEntryAssembly()
	//var assembly = System.Reflection.Assembly.GetEntryAssembly();

	var assembly = System.Reflection.Assembly.Load("MyAssemplyName");
	var res = new System.Resources.ResourceManager("MyNameSpace.Properties.Resources", assembly);
	var image = Image.FromStream(res.GetStream("MyImageName"));

	//리소스 파일에 있는 특정 문자열을 가져오려면
	var text = res.GetString("MyResourceName", System.Globalization.CultureInfo.CurrentCulture);
}
catch (Exception ex)
{
	throw ex;
}
다른 프로젝트의 특정 폴더에 있는 이미지에 접근하려면
try
{
	var assembly = System.Reflection.Assembly.Load("MyAssemplyName");
	var image = Image.FromStream(assembly.GetManifestResourceStream("MyNameSpace.MyFolderName.MyImageFileName"));
}
catch (Exception ex)
{
	throw ex;
}
전체 리소스 이름을 알고 싶다면 다음 메소드를 사용한다.
var list = System.Reflection.Assembly.Load("MyAssemplyName").GetManifestResourceNames();

foreach (var item in list)
{
	...
}


'C#' 카테고리의 다른 글

사진 이미지 관련 클래스  (0) 2016.04.14
오라클 BLOB 등록 및 조회  (0) 2016.04.14
윈도우에 등록된 확장자를 가진 파일 열기  (0) 2011.11.16
날짜 문자열을 DateTime형으로 변환  (0) 2011.10.27
ComboBox SelectedItem  (0) 2011.10.27

윈도우에 등록된 확장자를 가진 파일을 열고자 할 때 사용한다.

간단하게
	Process.Start(filePath);
또는
private void OpenFile(string filePath)
{
	try
	{
		System.Diagnostics.ProcessStartInfo info = new System.Diagnostics.ProcessStartInfo();
		info.RedirectStandardOutput = true;
		info.UseShellExecute = false;
		info.CreateNoWindow = true;
		info.FileName = "cmd";
		info.Arguments = "/c \"" + filePath + "\"";	//실행 후 cmd.exe를 종료한다.

		System.Diagnostics.Process proc = new System.Diagnostics.Process();
		proc.StartInfo = info;
		proc.Start();

		//string result = proc.StandardOutput.ReadToEnd();
		//MessageBox.Show(result);
	}
	catch (Exception ex)
	{
		MessageBox.Show(ex.Message);
	}
}

아래처럼 DateTime.ParseExact를 이용한다.

DateTime date = DateTime.ParseExact("20111027"
		, "yyyyMMdd"
		, new System.Globalization.CultureInfo("ko-KR"));

또는

DateTime date = DateTime.ParseExact("2011-10-27", "yyyy-MM-dd", null);

null을 입력하여 현재 CultureInfo를 사용한다.

ComboBox SelectedItem

C#2011. 10. 27. 11:08
DataTable로 바인딩 하여 콤보박스를 표시했을 경우
선택한 Row 전체를 가져오고자 할 때
	var columnValue = ComboBox.SelectedRow["ColumnName"].ToString();
또는
	var selectedRow = ComboBox.SelectedItem as DataRowView;
	var columnValue = selectedRow["ColumnName"].ToString();

ValueMember나 DisplayMember로 지정하지 않은 컬럼의 값으로
콤보박스를 선택하고자 할 때
public static DataRowView GetComboSelectedItem(ComboBox cbo
	, string columnName, string valueForSelect)
{
	foreach (DataRowView row in cbo.Items)
	{
		if (row[columnName].ToString() == valueForSelect)
		{
			return row;
		}
	}

	return null;
}

DataTable dt = ...;

cboCombo.DisplayMember = "Text";
cboCombo.ValueMember = "Code";
cboCombo.DataSource = dt;

cboCombo.SelectedItem
	= GetComboSelectedItem(cboCombo, "OtherColumnName", "04");


콤보박스 Dictionary 로 바인딩
var list = new Dictionary<string, int>();
list.Add("1", 100);
list.Add("2", 200)
list.Add("3", 300);

combobox.DisplayMember="Key";
combobox.ValueMember="Value";
combobox.DataSource = new BindingSource(list, null);