한 동안 쉐어포인트 개발만 하다가 오늘 ASP.NET을 좀 사용하게 되어서 개발을 마치고 확인하던 중..

IE에서는 잘 보이는데 크롬에서 메뉴가 이상하게 나타나는 현상을 보게 되었습니다.

Rander 이벤트 부분을 전혀 타지를 않네요…

 

일단 저는 System.Web.UI.WebControls.Menu를 상속받아서 커스텀 컨트롤로 만든 상태이구요..

아래와 같이 IE에서는 정상적으로 나오는 것을 확인 할 수 있습니다.

 

헌데 크롬에서는 아래와 같이 나타납니다.

 

클릭해 보면 크롬의 경우 버튼으로 구현되어 자기 스스로 랜더링 부분을 확!!! 바꿔 버린 상태입니다.

검색하니 바로 나오긴 하네요..

 

방법은 코드를 넣는 방법과 그리고 ASP_Browsers 폴더에 browser 파일을 이용하는 방법이 있습니다.

일단 코드는 아래와 같이 작성하시면 됩니다.

protected void Page_PreInit(object sender, EventArgs e)
{
	if (Request.ServerVariables["http_user_agent"].IndexOf("Safari", StringComparison.CurrentCultureIgnoreCase) != -1)
	{
		Page.ClientTarget = "uplevel";
	}
}

// 혹은 아래와 같은 방법!

protected void Page_PreInit(object sender, EventArgs e)
{
	if (Request.UserAgent.Contains("AppleWebKit"))
		Request.Browser.Adapters.Clear();
}

 

그리고 Browser파일을 이용하는 방법은 프로젝트 파일에서 마우스 오른쪽 –> 추가 –> ASP.NET 폴더 추가 –> App_Browsers 추가 그리고 생성된 폴더에서 마우스 오른쪽 –> 추가 –> 새 파일 추가 –> browser 파일 선택 후 파일명은 chrome.browser 로 합니다.

 

그리고 아래 부분 코드 추가

<browsers>
	....
	<browser refID="Safari1Plus">
		<controlAdapters>
			<adapter controlType="System.Web.UI.WebControls.Menu" adapterType="" />
		</controlAdapters>
	</browser>
</browsers>

그리고 아직 운영에서 직접 돌려본 경험이 없어서. 어떻게 되는지 정확히는 말씀 못 드리겠습니다. ㅡ.ㅡ;;;;

일단 잘 나오긴 합니다. *_*

 

고맙습니다.


XmlDocument Transform의 경우에는 아래와 같이 하시면 됩니다.

2009/01/13 - [CSharp/Development] - Xml Xslt Transform with C#


요즘 XDocument를 많이 사용하고 있어서 Extensions 매소드로 따로 만들어 보았습니다.

별로 어려운 부분은 없으며, 그냥 아래 코드를 참고 하시면 될 것 같습니다.


Extension Method

public static class XDocExtensions
{
	#region // static string GetTransformation(this XDocument xDoc, string strXslPath) //
	/// <summary>
	/// XDocument에 Xsl를 트랜스포메이션 한 후 해당 데이터를 반환한다.
	/// </summary>
	/// <param name="xDoc">Xml Doc</param>
	/// <param name="strXslPath">Xsl Path</param>
	/// <returns>Transform Data</returns>
	public static string GetTransformation(this XDocument xDoc, string strXslPath)
	{
		string strResult = String.Empty;
		XslCompiledTransform xsl = new XslCompiledTransform(true);
		xsl.Load(strXslPath);

		using (var ms = new MemoryStream())
		{
			XmlWriterSettings settings = new XmlWriterSettings()
			{
				ConformanceLevel = ConformanceLevel.Auto
			};

			using (var writer = XmlWriter.Create(ms, settings))
			{
				xsl.Transform(xDoc.CreateReader(), writer);

				writer.Flush();
				ms.Position = 0;

				strResult = Encoding.UTF8.GetString(ms.GetBuffer());
			}
		}

		return strResult;
	}
	#endregion
}


아래는 해당 메소드 호출 부분입니다.

XDocument doc = new XDocument(
	new XElement("Roots",
		new XElement("Item", "1")
		, new XElement("Item", "2")));

string strTransformData = String.Empty;
strTransformData = doc.GetTransformation(Server.MapPath(strXslPath));

 

이상입니다.

감사합니다.


 

C# 이 번주 월요일과 금요일 가져오는 방식

 

내가 왜.. 이런걸 포스팅 하고 있는지 모르겠지만.

결론은 코드 *_*;;;

 

DateTime dtToday = DateTime.Now;

System.Globalization.CultureInfo ciCurrent = System.Threading.Thread.CurrentThread.CurrentCulture;
DayOfWeek dwFirst = ciCurrent.DateTimeFormat.FirstDayOfWeek;
DayOfWeek dwToday = ciCurrent.Calendar.GetDayOfWeek(dtToday);

int iDiff = dwToday - dwFirst;
DateTime dtFirstDayOfThisWeek = dtToday.AddDays(-iDiff + 1);
DateTime dtLastDayOfThisWeek = dtFirstDayOfThisWeek.AddDays(4);
MessageBox.Show(dtFirstDayOfThisWeek.ToLongDateString());
MessageBox.Show(dtLastDayOfThisWeek.ToLongDateString());

 

DayOfWeek class를 이용하여 가져온다.

해당 class는 여기를 선택하여 확인 하시면 됩니다.

 

이상입니다.~

 

감사합니다.


 

ListItemCollection Sorting 방법

 

허무하다 싶을 정도로 간단하다 *_*;;

 

오랜만에 쓰는 포스팅.. ㅋ

 

// Ascending
ddlFirstClockSetting.DataSource = ddlFirstClockSetting.Items.Cast<ListItem>().OrderBy(o => o.Text).ToList();
ddlFirstClockSetting.DataBind();

// Descending
ddlFirstClockSetting.DataSource = ddlFirstClockSetting.Items.Cast<ListItem>().OrderByDescending(o => o.Text).ToList();
ddlFirstClockSetting.DataBind();

 

날로 먹는 포스팅 ㅡ.ㅡ;;

 

여기서 중요한 것은

using System.Linq;


헌데 결정적인 문제가 있습니다.
바로 Value에 대해서는 처리가 안됩니다.
Value가 있는 경우에는 Value Data가 삭제 됩니다.

위의 Linq 처리 방식은 이게 문제점입니다. *_*;;;;;;;;

for문을 돌면서 Sorting을 해 줘야 Value 까지 다 잘 살아 있습니다.

코드는 아래와 같습니다.

#region SortDropDownList
/// 
/// method to sort a DropDownList
/// 
/// DropDownList to sort
public void SortDropDownList(DropDownList ddl)
{
	ListItem[] sorted = new ListItem[ddl.Items.Count];
	for (int i = 0; i < sorted.Length; i++)
	{
		Array.Resize(ref sorted, i);
		sorted[i] = ddl.Items[i];
	}

	Array.Sort(sorted);

	ddl.Items.Clear();
	ddl.Items.AddRange(sorted);
}
#endregion



이상 입니다.
감사합니다.


 

OpenXml을 이용하여 엑셀 파일의 빈 셀 읽기

 

OpenXml을 이용하면 처음으로 부딪치게 되는 문제가 바로 빈 셀입니다.

저는 이 문제를 DataTable을 이용하여 해결하였습니다.

 

첫 번째 Row가 제목 열이라 생각하고 첫 번째의 Row 정보를 DataTable의 컬럼으로 만들고,

Data에 해당하는 Row를 DataTable에 입력하는 형태로 진행하였습니다.

 

DataTable에 입력하는 방식은 CellType.CellReference의 값을 읽어서 처리하는 형태입니다.

 

아래는 전체 코드입니다.

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

using System.Data;
using System.IO;
using System.Text.RegularExpressions;

using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
using DocumentFormat.OpenXml.Wordprocessing;

namespace WebApplication1.OpenXml
{
	public partial class ReadExcelData : System.Web.UI.Page
	{
		protected void Page_Load(object sender, EventArgs e)
		{
			using (SpreadsheetDocument myDoc = SpreadsheetDocument.Open(@"C:\test.xlsx", true))
			{
				IEnumerable<Sheet> sheets = myDoc.WorkbookPart.Workbook.Descendants<Sheet>();
				WorksheetPart worksheetPart1 = myDoc.WorkbookPart.GetPartById(sheets.First().Id) as WorksheetPart;
				Worksheet sheet = worksheetPart1.Worksheet;
				IEnumerable<Row> datarow = from row in sheet.Descendants<Row>()
										   where row.RowIndex > 0
										   select row;

				DataTable dt = new DataTable("test");

				int i = 0;
				foreach (Row row in datarow)
				{
					if (i == 0)
					{
						foreach (Cell cell in row.Descendants<Cell>())
						{
							dt.Columns.Add(new DataColumn(GetColumnName(cell.CellReference), typeof(string)));
						}
					}
					else
					{
						DataRow dr = dt.NewRow();
						foreach (Cell cell in row.Descendants<Cell>())
						{
							dr[GetColumnName(cell.CellReference)] = GetCellValue(myDoc, cell, myDoc);
						}

						dt.Rows.Add(dr);
					}

					i++;
				}

				dt.WriteXml(@"C:\test\test11.xml");
			}
		}

		private string GetColumnName(string cellReference)
		{
			Regex regex = new Regex("[A-Za-z]+");
			Match match = regex.Match(cellReference);

			return match.Value;
		}

		private string GetCellValue(SpreadsheetDocument document, Cell cell, SpreadsheetDocument myDoc)
		{
			SharedStringTablePart stringTablePart = document.WorkbookPart.SharedStringTablePart;
			string value = cell.CellValue != null ? cell.CellValue.InnerXml : String.Empty;

			if (cell.DataType != null && cell.DataType.Value == CellValues.SharedString)
				return stringTablePart.SharedStringTable.ChildElements[Int32.Parse(value)].InnerText;
			else if (cell.StyleIndex.InnerText.Equals("1"))
			{
				string strDate = String.Empty;
				DateTime cellDate = DateTime.FromOADate(Convert.ToDouble(cell.CellValue.InnerText));

				if (cellDate != null)
					strDate = cellDate.ToString("yyyy-MM-dd");

				return strDate;
			}
			else
				return value;
		}
	}
}

 

이상입니다.

 

감사합니다~

 

  1. Santi 2011.08.18 08:35

    Oye wey, no te conozco y no me conoces. Es más, ni hablamos el mismo idioma, así que usa Google. Pero, te amo (no homo). Me acabas de dar la solución que necesitaba. ¡Gracias!

    :D

 

OpenXml을 이용하여 엑셀 파일의 날짜 필드(셀) 값 읽어 오기

 

엑셀에서 2011-05-12 와 같이 날짜를 입력하게 되면, 해당 셀은 날짜형 포멧으로 변경되게 됩니다.

 

이를 OpenXml을 이용하여 읽는 방법은 아래와 같습니다.

 

먼저 해당 Excel 파일을 압출 해제 하고 Xml을 확인하게 되면 Sheet1.xml 상에서는 아래와 같이 입력되어 있습니다.

<row r="3" spans="1:3" x14ac:dyDescent="0.3">
	<c r="A3" s="1">
		<v>40310</v>
	</c>
</row>

일반 텍스트의 경우 <c r=”A3” t=”s”>와 같은 형태로 되어  있으나 날짜 형의 경우는 S=”1” S로 시작하게 됩니다.

 

값이 40310 이라는 UInt32Value의 형태로 입력되게 됩니다.

 

변경하는 방법은 C#에서 아래와 같이하면 됩니다.

string strDate = String.Empty;
DateTime cellDate = DateTime.FromOADate(Convert.ToDouble(cell.CellValue.InnerText));

if (cellDate != null)
	strDate = cellDate.ToString("yyyy-MM-dd");

 

위와 같이 변경하는 방법은 standard date의 경우에만 확인하였으며, Formatted date 형의 경우에는 확인하지 못하였습니다.
반대로 적용할 경우에는  DateTime.ToOADate Method로 이용을 하시면 됩니다.

 

해당 date의 number format 확인 방법은 Xml의 Style.xml에서 확인 가능하며, 아래 xml의 numFmtID 값으로 구분하면 됩니다.

<cellXfs count="2">
	<xf numFmtId="0" fontId="0" fillId="0" borderId="0" xfId="0">
		<alignment vertical="center"/>
	</xf>
	<xf numFmtId="14" fontId="0" fillId="0" borderId="0" xfId="0" applyNumberFormat="1">
		<alignment vertical="center"/>
	</xf>
</cellXfs>

 

numFmtId가 14~ 22 Standard

numFmtId가 160~ 이상의 값은 Fomatted date 형이라고 보시면 될 것 같습니다.

 

전체 Sample은 아래에서 확인 할 수 있습니다.

protected void Page_Load(object sender, EventArgs e)
{
	using (SpreadsheetDocument myDoc = SpreadsheetDocument.Open(@"C:\test.xlsx", true))
	{
		IEnumerable<Sheet> sheets = myDoc.WorkbookPart.Workbook.Descendants<Sheet>();
		WorksheetPart worksheetPart1 = myDoc.WorkbookPart.GetPartById(sheets.First().Id) as WorksheetPart;
		Worksheet sheet = worksheetPart1.Worksheet;
		IEnumerable<Row> datarow = from row in sheet.Descendants<Row>()
									where row.RowIndex > 0
									select row;

		StringBuilder sbData = new StringBuilder();
		foreach (Row row in datarow)
		{
			foreach (Cell cell in row.Descendants<Cell>())
			{
				string strData = String.Format("cell.CellReference={0}, cell.value={1}", GetColumnName(cell.CellReference), GetCellValue(myDoc, cell, myDoc));
				sbData.AppendLine(strData);
			}
		}

		lblTest.Text = sbData.ToString();
	}
}

private string GetColumnName(string cellReference)
{
	Regex regex = new Regex("[A-Za-z]+");
	Match match = regex.Match(cellReference);

	return match.Value;
}

private string GetCellValue(SpreadsheetDocument document, Cell cell, SpreadsheetDocument myDoc)
{
	SharedStringTablePart stringTablePart = document.WorkbookPart.SharedStringTablePart;
	string value = cell.CellValue != null ? cell.CellValue.InnerXml : String.Empty;

	if (cell.DataType != null && cell.DataType.Value == CellValues.SharedString)
		return stringTablePart.SharedStringTable.ChildElements[Int32.Parse(value)].InnerText;
	else if (cell.StyleIndex.InnerText.Equals("1"))
	{
		string strDate = String.Empty;
		DateTime cellDate = DateTime.FromOADate(Convert.ToDouble(cell.CellValue.InnerText));

		if (cellDate != null)
			strDate = cellDate.ToString("yyyy-MM-dd");

		return strDate;
	}
	else
		return value;
}

 

 

이상입니다.

감사합니다.

 

MSDN

Custom Site Map Providers in ASP.NET 2.0

Site Map Providers

 

Code

Web.config

 

 

aspx

 

MSSQL Table

 

 

MSSQL Stored Procedure

 

 

MSSQL Table-Data

 

 

SqlSiteMapProvider.cs

 

 

Output





 

C#으로다가 이미지, 혹은 텍스트 워터마크 만들기
파일 다이알 로그로다가 워터 마크 이미지 받아서.

클립보드에 들어 있는 이미지에 워터 마크 삽입..

항상 컴퓨터에 상주시켜 놓고 복사할때마다 워터마크 자동으로 넣어주는 프로그램을 만들고 싶으나.

귀찮아서 패스~

ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

아~ 개으름뱅이 

 

try
{
	OpenFileDialog ofd = new OpenFileDialog();
	ofd.Filter = "Images (*.BMP;*.JPG;*.GIF;*.PNG)|*.BMP;*.JPG;*.GIF;*.PNG";
	ofd.Multiselect = false;
	ofd.RestoreDirectory = true;
	ofd.CheckFileExists = true;
	ofd.CheckPathExists = true;
	ofd.InitialDirectory = @"D:\Angeleyes\SlrClub Images Template";
	DialogResult di = ofd.ShowDialog();
	if (di.Equals(DialogResult.OK))
	{
		//System.IO.Stream st = ofd.OpenFile();
		//Bitmap bit = new Bitmap(st);

		Image img = Clipboard.GetImage();
		if (img != null)
		{
			//Graphics gra = Graphics.FromImage(img);
			//Image watermark = Image.FromStream(ofd.OpenFile());
			//Bitmap logo = new Bitmap(watermark);

			//logo.SetResolution(img.HorizontalResolution, img.VerticalResolution);

			//gra.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceOver;
			//gra.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.GammaCorrected;
			//gra.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
			//gra.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
			//gra.DrawImage(logo, new Point(70, 70));

			////img.Save(@"C:\test.jpg");
			//pictureBox1.Image = img;

			string Copyright = "Copyright � 2011 - Angeleyes.kr";

			Image imgPhoto = Clipboard.GetImage();
			int phWidth = imgPhoto.Width; int phHeight = imgPhoto.Height;

			using (Bitmap bmPhoto = new Bitmap(phWidth, phHeight, System.Drawing.Imaging.PixelFormat.Format24bppRgb))
			{
				bmPhoto.SetResolution(72, 72);

				using (Graphics grPhoto = Graphics.FromImage(bmPhoto))
				{
					Image imgWatermark = new Bitmap(Image.FromStream(ofd.OpenFile()));
					int wmWidth = imgWatermark.Width;
					int wmHeight = imgWatermark.Height;

					grPhoto.DrawImage(
						imgPhoto,
						new Rectangle(0, 0, phWidth, phHeight),
						0,
						0,
						phWidth,
						phHeight,
						GraphicsUnit.Pixel);

					#region // Copyright //
					int[] sizes = new int[] { 16, 14, 12, 10, 8, 6, 4 };
					Font crFont = null;
					SizeF crSize = new SizeF();
					for (int i = 0; i < 7; i++)
					{
						crFont = new Font("arial", sizes[i], FontStyle.Regular);
						crSize = grPhoto.MeasureString(Copyright, crFont);

						if ((ushort)crSize.Width < (ushort)phWidth)
							break;
					}

					int yPixlesFromBottom = (int)(phHeight * .05);
					float yPosFromBottom = ((phHeight - yPixlesFromBottom) - (crSize.Height / 2));
					float xCenterOfImg = (phWidth / 2);

					StringFormat StrFormat = new StringFormat();
					StrFormat.Alignment = StringAlignment.Center;

					SolidBrush semiTransBrush2 = new SolidBrush(Color.FromArgb(153, 0, 0, 0));

					grPhoto.DrawString(Copyright,
						crFont,
						semiTransBrush2,
						new PointF(xCenterOfImg + 1, yPosFromBottom + 1),
						StrFormat);

					SolidBrush semiTransBrush = new SolidBrush(Color.FromArgb(153, 255, 255, 255));

					grPhoto.DrawString(Copyright,
						crFont,
						semiTransBrush,
						new PointF(xCenterOfImg, yPosFromBottom),
						StrFormat); 
					#endregion

					Bitmap bmWatermark = new Bitmap(bmPhoto);
					bmWatermark.SetResolution(imgPhoto.HorizontalResolution, imgPhoto.VerticalResolution);

					Graphics grWatermark = Graphics.FromImage(bmWatermark);

					System.Drawing.Imaging.ImageAttributes imageAttributes =
							new System.Drawing.Imaging.ImageAttributes();
					System.Drawing.Imaging.ColorMap colorMap = new System.Drawing.Imaging.ColorMap();

					colorMap.OldColor = Color.FromArgb(255, 0, 255, 0);
					colorMap.NewColor = Color.FromArgb(0, 0, 0, 0);
					System.Drawing.Imaging.ColorMap[] remapTable = { colorMap };

					imageAttributes.SetRemapTable(remapTable, System.Drawing.Imaging.ColorAdjustType.Bitmap);

					float[][] colorMatrixElements = {
												new float[] {1.0f,  0.0f,  0.0f,  0.0f, 0.0f}
												,new float[] {0.0f,  1.0f,  0.0f,  0.0f, 0.0f}
												,new float[] {0.0f,  0.0f,  1.0f,  0.0f, 0.0f}
												,new float[] {0.0f,  0.0f,  0.0f,  0.3f, 0.0f}
												,new float[] {0.0f,  0.0f,  0.0f,  0.0f, 1.0f}
											};

					System.Drawing.Imaging.ColorMatrix wmColorMatrix = new System.Drawing.Imaging.ColorMatrix(colorMatrixElements);

					imageAttributes.SetColorMatrix(wmColorMatrix, System.Drawing.Imaging.ColorMatrixFlag.Default, System.Drawing.Imaging.ColorAdjustType.Bitmap);

					int xPosOfWm = ((phWidth - wmWidth) - 10);
					int yPosOfWm = 10;

					grWatermark.DrawImage(imgWatermark,
						new Rectangle(xPosOfWm, yPosOfWm, wmWidth, wmHeight),
						0,
						0,
						wmWidth,
						wmHeight,
						GraphicsUnit.Pixel,
						imageAttributes);

					imgPhoto = bmWatermark;
				}
			}

			pictureBox1.SizeMode = PictureBoxSizeMode.AutoSize;
			pictureBox1.Image = imgPhoto;
			Clipboard.SetImage(imgPhoto);

			img.Dispose();
			imgPhoto.Dispose();
		}
		else
			MessageBox.Show("img Null");
	}
	else
		MessageBox.Show(di.ToString());
}
catch (Exception ex)
{
	MessageBox.Show(ex.ToString());
}





 

닷넷(.NET Framework) 버전 별 새로운 기능에 대하여..

 

현재 .net 버전은 4.0까지 나와 있습니다.

.net을 처음 접하시는 분은 바로 4.0이나 혹은 3.5를 다루게 되는데요.

 

새로운 기능들에 대해서 히스토리 문서를 작성합니다.

 

.net의 버전 종속성은 여기를 선택하여 이동하시고, 아래 이미지와 버전별 기능을 참고 하시면 어떤 식으로 흘러왔는지에 대한 흐름을 대충 파악하실 수 있을 것 같습니다.

 

 

.NET Framework 버전(VS 버전) 설명

 

  1. 1.0 (Visual Studio .NET)
    첫 번째 버전의 CLR 및 기본 클래스 라이브러리 파일의 첫 번째 버전은 포함되어 있습니다.
  2. 1.1 (Visual Studio .NET 2003)
    ASP.NET 및 ADO.NET 업데이트가 포함됩니다. 이 버전은 계속해서 두 번 서비스 팩 1 (SP1) 업데이트된 SP2 및. 또한 이 버전에 대해 여러 버전의 CLR 실행하려면 응용 프로그램이 단일 컴퓨터에서 side-by-side 실행이 도입되었습니다.
  3. 2.0 (Visual Studio 2005)
    새로 추가된 제네릭과 제네릭 컬렉션, ASP.NET 상당한 추가 등 기본 클래스 라이브러리 사용하여 CLR 버전이 도입되었습니다. 이 버전의 SP1 및 SP2 이후에 업데이트되었습니다.
  4. 3.0 (Visual Studio 2005)
    기본적으로 .NET Framework 2.0 Windows 프레젠테이션 파운데이션 (WPF만), Windows 통신 기반 (WCF), Windows 워크플로 파운데이션 (WF) 및 CardSpace 추가된 버전입니다. SP1 및 SP2 이후에 업데이트되었습니다.
  5. 3.5 (Visual Studio 2008)
    AJAX 사용 웹 사이트와 LINQ 같은 새로운 기능을 추가했습니다. SP1 업데이트를 .NET Framework 클라이언트 프로필, 동적 데이터 집합이 추가 기능이 추가되었습니다.
  6. 4 (Visual Studio 2010)
    새 버전의 CLR, 확장된 기본 클래스 라이브러리 및 확장성 관리 프레임워크 (MEF), 동적 언어 런타임 (DLR) 코드 계약을 같은 새로운 기능이 포함되어 있습니다.

 

좀 더 자세한 .NET Framework 버전의 새로운 기능은 아래를 참고하여 주십시오.

 

.NET Framework 버전 2.0의 새로운 기능

참고 경로 : http://msdn.microsoft.com/ko-kr/library/t357fb32.aspx

 

C# 2.0 언어 및 컴파일러의 새로운 기능 새로운 창으로 보기

 

.NET Framework 버전 3.0의 새로운 기능

참고 경로 : http://msdn.microsoft.com/ko-kr/library/aa480198.aspx

3.0에서 WPF(Windows Presentation Foundation), WCF(Windows Communication Foundation), WF(Windows Workflow Foundation) 그리고 Windows CardSpace의 기술이 나옵니다.

 

소개 자료 : Introducing the .NET Framework 3.0(영문)

WPF, WCF, WF 등의 기술적 상세 내용은 3.5에서 좀 더 구체화 되었습니다.

 

그리고 C#의 새로운 기능으로 몇 가지가 추가되었는데 중요한 부분입니다.

 

해당 내용은 여기를 선택하여 새로운 창으로 확인 할 수 있습니다.

 

여기를 선택하여 새로운 창으로 3.0의 새로운 기능을 샘플로 확인 할 수 있습니다.

 

.NET Framework 버전 3.5의 새로운 기능

참고 경로 : http://msdn.microsoft.com/ko-kr/library/bb332048(v=vs.90).aspx

.NET Framework 버전 3.5 SP1의 새로운 기능 : 여기를 선택하여 새로운 창으로 이동

 

 

.NET Framework 4의 새로운 기능

참고 경로 : http://msdn.microsoft.com/ko-kr/library/ms171868.aspx

 

 

C#의  가장 큰 변화는 Dynamic입니다.

 

새로운 기능에 대한 내용 : 새로운 창으로 이동(Blog)

병렬 프로그래밍에 대한 내용 : 새로운 창으로 이동(Blog)

 

이상으로 .NET Framework의 버전별 새로운 기능들에 대해서 알아보았습니다.

 

C#에서는 역시 3.0, 3.5에서 가장 큰 변화가 있었던 것 같습니다.

LINQ라던지… 2.0의 세상도 넓다는 것을 알 수 있었고요..

 

추후 버전이 바뀌거나 SP가 나오는 경우에는 새로운 포스트로 찾아 뵙도록 하겠습니다.

그때는 항상 코드와 함께~

 

 

감사합니다.

 

 

Silverlight 4를 개발 환경 구성..

 

2011-02-08 일 작성 된 글이며, Silverligth 5가 나올 것임에도 불구하고..

작성합니다.

 

1. VISUAL STUDIO 2010

http://www.microsoft.com/express/Downloads/

 

 

저는 회사 라이센스가 있어서. Professional을 사용하고 있습니다.

trial version을 원하시는 분은 아래 링크로 이동하시면 됩니다.

http://www.microsoft.com/visualstudio/en-us/download

 

2. Microsoft Silverlight 4 Tools for Visual Studio 2010

http://www.microsoft.com/downloads/en/details.aspx?FamilyID=B3DEB194-CA86-4FB6-A716-B67C2604A139

vs2010과 동일한 언어로 다운로드하여 설치하시면 됩니다.

 

 

다운로드 후 설치

 

 

3. Silverlight 4 Toolkit

http://silverlight.codeplex.com/

 

 

windows phone toolkit도 있으나, 오늘은 단순 silverlight 4 toolkit만 다운로드 하여 설치 하도록 하겠습니다.

 

 

여기까지가 VS 2010에서 Silverlight를 사용할 수 있도록 모든 환경 구성이 완료 되었습니다.

헌데 VS 2010에서 Silverlight를 그리는? 것이 용이 하지 않습니다.

 

엑션 같은 것도 동일하구요

 

Expression Blend 4를 이용하시면 좀 더 쉽게 활용이 가능하여 Expression Blend를 설치 하실 것을 권장합니다.

 

PS. 1. Expression Blend 4

http://expression.microsoft.com/ko-kr/cc136523(en-us).aspx

Blend가 설치 된 분은 SP1도 나와 있으니 확인 하시기 바랍니다.

Blend –> 상위 메뉴 –> 도움말 –> Microsoft Expression Blend 정보(A)

 

 

 

지금 저의 상태가 SP1이 적용되지 않은 상황입니다.

 

SP1 다운로드 : Microsoft Expression Blend 4 SP1(서비스 팩 1)

 

SP1에서 향상되거나 수정된 부분

Expression Blend 4 SP1(서비스 팩 1)에서는 버그가 수정되고 안정성이 향상되었을 뿐 아니라 Windows Phone 7 응용 프로그램 빌드에 대한 지원이 포함되었고 FXG 파일 형식을 지원할 수 있어 Adobe 디자인 도구와의 통합성도 향상되었습니다.

 

 

PS. 2. Deep Zoom Composer

http://www.microsoft.com/downloads/en/details.aspx?displaylang=en&FamilyID=457b17b7-52bf-4bda-87a3-fa8a4673f8bf

 

 

PS. 3. Microsoft Silverlight PivotViewer

http://www.microsoft.com/downloads/en/details.aspx?FamilyID=9A1BB862-D80C-4145-9320-B279A63BFF91

 

 

 

여기까지 이제 환경 구성은 끝입니다.

windows phone 환경을 구성하고자 하시는 분은 아래 링크에서 필요 파일을 더 설치 하시기 바랍니다.

http://www.indreams.co.kr/blog/59?category=0

http://gongdosoft.com/483

 

 

아차차~

도움말도 있습니다. *_*;;

한글로요..

Chm 파일이며 다운로드 링크는 아래와 같습니다.

http://www.microsoft.com/downloads/en/details.aspx?FamilyID=24CEA29E-042E-41C9-AA16-684A0CA5F5DB&displaylang=en

 

 

또 있네요.

Training course… (영)

http://www.microsoft.com/downloads/en/details.aspx?FamilyID=24CEA29E-042E-41C9-AA16-684A0CA5F5DB&displaylang=en

 

 

로컬 html 로 구성되어 webpage로 보실 수 있습니다.

 

 

여기까지입니다.

 

감사합니다.

'CSharp > SilverLight' 카테고리의 다른 글

Silverlight 4 개발 환경 구성하기  (4) 2011.02.08
  1. 지스 2011.02.25 14:05

    좋은정보 감사합니다.

    • Favicon of http://angeleyes.tistory.com BlogIcon Angeleyes 2011.02.28 11:08

      좋은 정보가 될 수 있음에 감사드립니다. ^^

  2. 질문이 있어요~ 2011.03.04 21:54

    실버라이트4만 클릭해서 다운받으려니까
    실행이 안돼서요~
    처음부터 나와있는거 저거 전부다 받아야 하는건가요?
    영상만 나오게끔 하고싶은데..
    부분적으로 받을수있을까요??

    • Favicon of http://angeleyes.tistory.com BlogIcon Angeleyes 2011.03.07 11:19

      http://www.microsoft.com/getsilverlight/Get-Started/Install/Default.aspx

      사용자 설치 버전은 위 경로를 이용하시면 됩니다.

뉴스레터로 항상 트레이닝 킷이 날아 오는걸 방치하다가.

오늘은 한번 설치 해 보았습니다.

개발자라면.. 신규 기능에 대해서 알고 있을 필요가 있을 것 같아.. 이렇게 올려 봅니다.

 

오늘은 소개해 드릴 건 VS 2010 및 .NET Framework 4 트레이닝 킷 입니다.

http://www.microsoft.com/downloads/en/details.aspx?familyid=752CB725-969B-4732-A383-ED5740F02E93&displaylang=en

 

178 Mbyte정도 되고요..

설치파일 하나이며, 설치하게 되면 아래와 같은 화면을 볼 수 있습니다.

 

 

여기서 우측 메뉴의 ASP.NET 4를 선택하여 이동하게 되면

ASP.NET MVC, 새로운 기능, 개발툴, 에 관한 자료(동영상, pptx 등)를 볼 수 있습니다.

 

비디오의 경우 각 세션 별로 진행되니.. 도움이 되시리라 생각됩니다.

 

기초적인 기술들이지만 Parallel, Sharepoint, MVC 등등 아주 유용한 자료가 많이 있습니다.

꼭 참고해 보시면 좋은 것 같습니다.

 

이상입니다.

감사합니다.


  1. Favicon of http://itopen.tistory.com BlogIcon AW메모리얼 2011.01.19 16:52

    asp.net은 구조 자체로 MVC를 지원하는건가요?
    jsp는 Struts 같은 프레임워크를 사용해서 구축해줘야 하더라구요

    • Favicon of http://angeleyes.tistory.com BlogIcon Angeleyes 2011.01.19 23:01

      mvc 설치파일과 vs 익스텐션만 설치하시면 사용할 수 있습니다..
      자바보다 설정등등 훨씬 쉬운것으로 알고 있습니다. ^^

 

asp.net에서 updatepanel을 사용하였을 경우

jquery 혹은 body tag 의 onload event가 동작하지 않습니다.

 

처음에는 동작하나. 이벤트가 발생하여  updatepanel이 동작한 후부터는 정상적인 동작이 되지 않습니다.

 

Sys.webForms.PageRequestManager를 이용하여 처리 할 수 있습니다.

 

다음은 예제 소스입니다.

aspx

	
	

다음 강조된 부분을 참고하시면 됩니다.
    

 

cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace WebApplication2.Test
{
	public partial class UpdatePanel_In_Pageload_script : System.Web.UI.Page
	{
		protected void Page_Load(object sender, EventArgs e)
		{

		}

		protected void btnTest_Click(object sender, EventArgs e)
		{
			txtRunatServer.Value = "test";
		}
	}
}

asp.net을 이용하여 web page 작성 시.

treeview control을 이용하는 경우가 많이 있습니다.

 

헌데 이놈의 라인이.. 깨지는 현상이 발생 됩니다.

 

오늘은 그 수정 방안을 알아보고자 합니다.

 

현상은 아래와 같습니다.

 

Code는 아래와 같습니다.

Tree.aspx (class 설정을 다음과 같이 합니다. CssClass="treestyle")


 

style 추가로 해당 현상을 수정할 수 있습니다.

Tree.aspx


    
	

 

적용 후 모습입니다.

 

Internet Explorer 8

 

호환성 보기 모드

 

FireFox 3.6

 

이렇게 모든 브라우저에서 잘 되는 것을 확인 할 수 있습니다.

IE 6에서는 원래 잘나오더군요 *_*

 

감사합니다.





1.4 doPostBack() 함수 사용하기

 

ASP.NET에서 새롭게 소개 된 웹 폼 페이지에서 서버와의 Submit 동작을 포스트 백(PostBack)이라는 동작으로 처리하고 있습니다. 포스트 백은 버튼 컨트롤(Button, LinkButton, ImageButton)들을 등록하면 확인할 수 있습니다. 이런 포스트 백의 이벤트를 클라이언트 스크립트에서 직접 접근하여 처리하는 방법에 대해서 지금부터 알아보도록 하겠습니다.

 

① PostBack 알아보기

웹 폼을 하나 만든 후 LinkButton과 Button, ImageButton을 하나씩 추가하여 다음과 같이 만들어 봅시다.

 

■ PostBack.aspx

------------------------------------------------------------------------

<%@ Page language="c#" Codebehind="PostBack.aspx.cs" AutoEventWireup="false" Inherits="ClientScript.PostBack" %>


             
                           
                           
                           
                           
                           
             
             
                           

LinkButton



------------------------------------------------------------------------

 

PostBack.aspx 페이지를 실행하면 LinkeButton, Button, ImageButton이 출력되고, 각각의버튼을 클릭하면 포스트 백이 발생합니다. ASP.NET에서는 이렇듯 버튼 컨트롤을 사용하는 것 만으로도 포스트 백이 동작하도록 이미 정의가 되어 있는 것입니다. 실행결과를 간단히 살펴본 후 HTML 소스 보기를 이용하여 클라이언트에 출력되는 코드를 한번 살펴보도록 합시다. 다음은 HTML 소스 코드 중에 중요한 내용만 정리한 것입니다.

 

■ PostBack.aspx.html

------------------------------------------------------------------------

LinkButton


------------------------------------------------------------------------

 

출력되는 HTML 코드에서 확인할 수 있듯이 ASP.NET의 웹 폼은 포스트 백을 기반으로 하며, 포스트 백을 처리하는 클라이언트 스크립트는 바로 __doPostBack() 메서드 부분입니다. LinkButton 컨트롤의 HTML 출력에서의 링크가 javascript:__doPostBack(‘LinkButton1’,’’)으로 설정되어 있는 것을 확인할 수 있습니다. Button 컨트롤의 경우에는 submit으로 변환되기 때문에 버튼을 클릭하면 폼 자체가 submit 되면서 포스트 백이 일어나게 됩니다. 또한 메서드의 인자로 eventTarget과 eventArgument는 각각 포스트 백을 일으키는 컨트롤의 UniqeID와 넘겨주는 인자를 가리키게 됩니다.

 

이렇듯 웹 폼에서 포스트 백 이벤트를 발생하기 위해서는 __doPostBack() 메서드를 호출해야 한다는 것을 한번 더 확인하고 다음으로 넘어갑시다.

 

② 클라이언트 스크립트에서의 포스트 백 사용

포스트 백 이벤트를 클라이언트에서 제어하게 되는 경우를 한번 알아봅시다. 앞서 살펴본 코드에서 포스트 백을 발생하기 위해서는 앞의 코드에서처럼 __doPostBack() 메서드를 사용하여야 하는데 직접 코드를 입력하여도 되지만 ASP.NET에서는 이미 Page 클래스에 메서드가 정의되어 있습니다. 바로 GetPostBackEventReference, GetPostBackClientHyperlink 메서드로 __doPostBack()의 문자로 반환하게 됩니다. 두 메서드의 차이로는 GetPostBackEventReference를 통해서는 doPostBack() 메서드의 문자가 출력되지만, GetPostBackClientHyperlink는 앞의 LinkButton의 출력결과처럼 <a> 태그에서 doPostBack() 메서드를 호출할 수 있도록 javascript: 문자가 앞에 붙게 됩니다. 이런 메서드들을 이용한다면 쉽게 클라이언트 스크립트나 HTML 컨트롤에서 포스트 백을 구현할 수 있게 됩니다.

 

그렇다면 실제 어떤 경우에 클라이언트에서 포스트 백을 사용하게 될까요? 예를 들어 버튼을 클릭하였을 때 발생하는 이벤트를 이미지의 하이퍼 링크를 클릭하였을 때도 똑같이 발생하고자 할 때, 로그인을 할 때 TextBox 컨트롤을 사용하고 있는 경우에 엔터를 눌렀을 때 버튼을 클릭한 것과 동일한 이벤트를 수행하고자 할 때 여러 가지 상황에서 활용할 수 있게 됩니다. 지금부터 간단한 예제를 통하여 클라이언트 또는 다른 컨트롤의 포스트 백으로 직접 접근하는 방법에 대해서 알아보도록 합시다. 예제는 Label 컨트롤과 Button 컨트롤을 추가하고, Button 컨트롤을 클릭할 때 Label에 버튼을 클릭하였다는 문자를 출력하게 됩니다. 간단히 이렇게 구현한 다음 HTML의 Button 컨트롤, HyperLink 컨트롤, TextBox 컨트롤들을 추가하여 각각 버튼을 클릭하였을 때와 엔터를 쳤을 때 모두 Button을 클릭한 결과를 나타낼 수 있도록 변경하였습니다. 코드를 확인해 봅시다.

 

■ DoPostBack.aspx

------------------------------------------------------------------------

<%@ Page language="c#" Codebehind="DoPostBack.aspx.cs" AutoEventWireup="false" Inherits="ClientScript.DoPostBack" %>


             
                           
                           
                           
                           
                           
                     
             
             
                           
                                        

HyperLink

">[HTML HyperLink]



------------------------------------------------------------------------

 

■ DoPostBack.aspx.cs (중요부분)

------------------------------------------------------------------------

private void Page_Load(object sender, System.EventArgs e)
{
             // 여기에 사용자 코드를 배치하여 페이지를 초기화합니다.
             Button2.Attributes["OnClick"] = "ImgButtonClick();";
             IMG1.Attributes["OnClick"] = "ImgButtonClick();";
             HyperLink1.NavigateUrl = Page.GetPostBackClientHyperlink(Button1, "");
             TextBox1.Attributes["onKeyPress"] = "if(event.keyCode == 13) {" + Page.GetPostBackEventReference(Button1) + "; return false;}";
}

…

private void Button1_Click(object sender, System.EventArgs e)
{
             Label1.Text += "Button 컨트롤에 의해 PostBack 되었습니다
"; }


------------------------------------------------------------------------

 

코드를 하나씩 확인해 보도록 합시다. 우선 aspx 파일에서 ImgButtonClick() 메서드를 선언하고, <%=Page.GetPostBackEventReference(Button1)%>를 통해서 Button1을 클릭하였을 때의 포스트 백을 발생하게 됩니다. 이런 효과는 cs 파일의 Button2.Attributes["OnClick"] = "ImgButtonClick();" 구문과 IMG1.Attributes["OnClick"] = "ImgButtonClick();" 구문에서 각각 처리되는 것을 확인할 수 있습니다. 출력되는 결과의 HTML 코드를 확인해 보면 각각의 컨트롤에 ImgButtonClick() 메서드가 맵핑되어 있는 것을 확인할 수 있습니다.

 

그리고 cs 파일의 HyperLink1.NavigateUrl = Page.GetPostBackClientHyperlink(Button1, "") 구문과 aspx 파일의 <a href="<%=Page.GetPostBackClientHyperlink(Button1, "")%>"> 구문을 통해서는 javascript:doPostBack(‘Button’,’’)로 맵핑하고 있습니다.

 

마지막으로 TextBox 컨트롤의 TextBox1.Attributes["onKeyPress"] = "if(event.keyCode == 13) {" + Page.GetPostBackEventReference(Button1) + "; return false;}" 통해서 엔터를 눌렀을 때에는 Button 클릭의 포스트 백을 발생하라고 선언하고 있습니다. 모든 작업이 완료된 후 실행 결과를 확인해 봅시다.




WPF 라고 해서 뭔가 특별하거나. 윈도우 폼과 전혀 다르거나 하지 않다!

윈도우 응용프로그램의 NotifyIcon을 그대로 사용한다.

그래서 WPF에서는 System.Windows.Form.dll 을 참조 하고 해당 dll 내의 클레스를 사용하면 되는 것이다.

먼저 코드를 보면 먼가 이해가 더 빠를 것 같다.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;

namespace WpfApplication1
{
	/// 
	/// CartList.xaml에 대한 상호 작용 논리
	/// 
	public partial class CartList : Window
	{
		public CartList()
		{
			InitializeComponent();
		}

		private void button1_Click(object sender, RoutedEventArgs e)
		{

		}

		private void Window_Loaded(object sender, RoutedEventArgs e)
		{
			try
			{
				System.Windows.Forms.ContextMenu menu = new System.Windows.Forms.ContextMenu();

System.Windows.Forms.MenuItem item1 = new System.Windows.Forms.MenuItem(); menu.MenuItems.Add(item1); item1.Index = 0; item1.Text = "E&xit"; item1.Click += delegate(object click, EventArgs eClick) { this.Close(); }; System.Windows.Forms.NotifyIcon notify = new System.Windows.Forms.NotifyIcon(); notify.Icon = new System.Drawing.Icon(@"Icon\Angeleyes-Mark.ico"); notify.Visible = true; notify.DoubleClick += delegate(object senders, EventArgs args) { this.Show(); this.WindowState = WindowState.Normal; }; notify.ContextMenu = menu; notify.Text = "Test"; } catch (Exception ex) { MessageBox.Show(ex.ToString()); } } protected override void OnStateChanged(EventArgs e) { if (WindowState.Minimized.Equals(WindowState)) { this.Hide(); } base.OnStateChanged(e); } } }
테스트 하느라 window_loaded 이벤트를 만들어 NotifyIcon을 생성하였으나
여기에 NotifyIcon을 생성하지 않고 생성자에서 생성하는 방식으로 변경하여도 무관하다.

위와 같이 ContextMenu도 생성하고 입력하였다.
어려운 부분은 하나도 없다~

윈도우 폼에서 트레이 아이콘을 한번이라도 만들어 보았다면 말이다.

아~

그리고 Click 과 같은 이벤트 헨들러를 delegate로 처리 하지 않고 자동 생성 되는 코드를 이용해도 된다~
이런 것도 있구나 라고 봐주시면 될 것 같다~

그리고 icon 의 경우.
폴더를 하나 생성하고 그 안에 아이콘 파일을 입력하였으며, 해당 아이콘 파일의 속성에서 빌드작업을
"포함 리소스"로 변경 후 출력 디렉토리로 복사 부분을 "항상 복사 혹은 변경된 내용만 복사"로 변경하여
빌드시 리소스로 포함되게 하여야 ContextMenu.Icon 생성시 에러가 발생되지 않는다.~

그럼 즐거운 코딩이 되시길~

'CSharp > WPF' 카테고리의 다른 글

NotifyIcon SystemTrayIcon(트레이 아이콘 생성 방법)  (4) 2010.01.26
  1. 김장수 2010.06.03 03:21

    protected override void OnStateChanged(EventArgs e)
    이부분에서 void 부분에..
    Expected class, delegate, enum, interface, or struct

    이런 에러가 뜨네요
    해결방법을 모르겠습니다. 도움글 부탁드립니다. ^^

    ps. Visual Studio 2010 버젼이고,
    WPF 에 대해서는 아무것도 모르는데
    그냥 해보고 싶어서 소스 짜깁기 하는 중이랍니다.

    • Favicon of http://angeleyes.tistory.com BlogIcon Angeleyes 2010.06.03 19:23

      저도 WPF 쪽은 완전 초보자라서요.
      소스를 그나마 봐야 알 수 있을 것 같습니다. ^^;;
      죄송합니다. 도움이 안되어서요..

      그리고. trayicon은 windows form과 동일합니다..

  2. 박진철 2010.06.03 20:04

    코드를 그대로 햇는데

    오류 CS0103: 'InitializeComponent' 이름이 현재 컨텍스트에 없습니다.

    라고하네요....23번라인에요.....

    도움 부탁드려요^^

    • Favicon of http://angeleyes.tistory.com BlogIcon Angeleyes 2010.06.04 10:21

      WPF 윈도우를 하나 생성하시고.
      Web용이 아닌 윈도우용으로 하셔야 됩니다.
      거기에 OnLoad 이벤트에 제가 작성한 Window_Loaded 안의 코드와 OnStateChanged 코드만 작성하시면 될 것 같습니다.

+ Recent posts