Ако зададете DataSource на DropDownList ръчно, може би сте попаднали на следния проблем:
Dim table As DataTable = DataAccessFunctions.GetDataTable(qry)
MyDropDownList.DataSource = table
MyDropDownList.DataBind()
MyDropDownList.DataTextField = "ControlTypeText"
MyDropDownList.DataValueField = "ID"
Дотук всичко изглежда наред, но след като заредите страницата вместо стойностите от таблицата, падащото меню ще съдържа DataRowView или нещо от сорта.
Решението е съвсем просто, поставете
MyDropDownList.DataTextField = "ControlTypeText"
MyDropDownList.DataValueField = "ID"
преди да зададате DataSource:
Dim table As DataTable = DataAccessFunctions.GetDataTable(qry)
MyDropDownList.DataTextField = "ControlTypeText"
MyDropDownList.DataValueField = "ID"
MyDropDownList.DataSource = table
MyDropDownList.DataBind()
Блог за ASP.NET
Блог за ASP.NET, често срещани проблеми, интересни решения и best practices.
16 май 2010, неделя
15 май 2010, събота
Как да напишем Switch/Select по тип?
В случая примерът е на VB.NET. Един от начините е да ползваме името, например:
Select Case ctl.GetType.Name
Case GetType(TextBox).Name
Exit Select
End Select
Select Case ctl.GetType.Name
Case GetType(TextBox).Name
Exit Select
End Select
Как много просто и лесно да си направим Captcha
Нужно е просто да си направим функция, която приема за параметър String, изобразява го като картинка и ни връща Bitmap. Можем да си начертаем и малко шарени линийки за да замажем текста и това е!
'''
''' Generates an image showing the given text
'''
''' The text to be shown in the image
'''
Public Shared Function DrawText(ByVal text As String) As Bitmap
Try
Dim b As Bitmap = New Bitmap(1, 1)
Dim f As Font = New Font("Verdana", 24)
Dim graphics As Graphics = graphics.FromImage(b)
'измерваме големината на текста с размер 24, който създаваме по-горе и декларираме
'нов Bitmap с тези височина и ширина
Dim width As Integer = CInt(graphics.MeasureString(text, f).Width)
Dim height As Integer = CInt(graphics.MeasureString(text, f).Height)
b = New Bitmap(b, New Size(width, height))
graphics = graphics.FromImage(b)
graphics.Clear(Color.DarkBlue)
Dim rnd As Random = New Random()
Dim points(60) As Point
'Създаваме произволни координати, които ще ползваме за да начертаем
'graphics.DrawBeziers(pen0, points) по-късно
For i As Integer = 0 To points.Length - 1
points(i) = New Point(CInt(rnd.Next(width)), CInt(rnd.Next(height)))
Next
'създаваме различни Pen с които да нашарим нашия Bitmap
Dim pen0 As Pen = New Pen(Color.PaleVioletRed)
pen0.Width = 2
pen0.DashStyle = Drawing2D.DashStyle.Dot
Dim pen1 As Pen = New Pen(Color.OldLace)
pen1.Width = 3
pen1.DashStyle = Drawing2D.DashStyle.Dash
Dim pen2 As Pen = New Pen(Color.PaleGreen)
pen2.Width = 4
pen2.DashStyle = Drawing2D.DashStyle.Dash
Dim pen3 As Pen = New Pen(Color.PaleGreen)
pen3.Width = 4
pen3.DashStyle = Drawing2D.DashStyle.Dash
Dim pen4 As Pen = New Pen(Color.PaleGreen)
pen4.Width = 4
pen4.DashStyle = Drawing2D.DashStyle.DashDotDot
'и нашарваме картинката
graphics.DrawLine(pen1, 0, 1, height, width)
graphics.DrawLine(pen2, 0, 1, width, height)
graphics.DrawLine(pen3, 5, 1, rnd.Next(height), rnd.Next(width))
graphics.DrawLine(pen4, 1, 5, rnd.Next(height), rnd.Next(width))
graphics.DrawBeziers(pen0, points)
graphics.DrawString(text, f, New SolidBrush(Color.White), 0, 0)
graphics.Flush()
' връща получения Bitmap с нашия CAPTCHA текст
Return b
Catch ex As Exception
Throw (New Exception("Captcha.vb > DrawText()", ex))
End Try
End Function
Сега остава да направим една ASPX страница която ще съдържа единствено Page_Load събитие в codebehind файла:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Try
'извикваме функцията, която връща картинка с текста
Dim b As Bitmap = Captcha.DrawText(Request.QueryString("text"))
Dim tempStream As System.IO.MemoryStream = New System.IO.MemoryStream()
b.Save(tempStream, System.Drawing.Imaging.ImageFormat.Gif)
Response.AddHeader("Content-Disposition", "inline; filename=captcha.gif")
Response.ContentType = "gif"
Response.BinaryWrite(tempStream.ToArray())
Catch ex As Exception
Log(ex, "GetCaptcha.aspx.vb > Page_Load()", "Request.QueryString(text) = " & Request.QueryString("text"))
Throw New Exception("GetCaptcha.aspx.vb > Page_Load()", ex)
End Try
End Sub
Тази страница ще използваме по-късно като ImageUrl на Image control в страницата където искаме да покажем нашите анти-бот цифрички и текст:)
Protected Sub DisplayCaptcha()
'създаваме произволно число (в случая, може и текст), което запазваме като
'ViewStatе("captcha") за да го сравним по-късно с това което е въвел потребителя
Dim rnd As Random = New Random()
ViewState("captcha") = rnd.Next(10000)
ImageCaptcha.ImageUrl = "GetCaptcha.aspx?text=" & ViewState("captcha")
End Sub
И това е! Както виждате е съвсем лесно да направим собствена анти бот CAPTCHA система, без да е нужно да ползваме готови и дори платени компоненти.
'''
''' Generates an image showing the given text
'''
''' The text to be shown in the image
'''
Public Shared Function DrawText(ByVal text As String) As Bitmap
Try
Dim b As Bitmap = New Bitmap(1, 1)
Dim f As Font = New Font("Verdana", 24)
Dim graphics As Graphics = graphics.FromImage(b)
'измерваме големината на текста с размер 24, който създаваме по-горе и декларираме
'нов Bitmap с тези височина и ширина
Dim width As Integer = CInt(graphics.MeasureString(text, f).Width)
Dim height As Integer = CInt(graphics.MeasureString(text, f).Height)
b = New Bitmap(b, New Size(width, height))
graphics = graphics.FromImage(b)
graphics.Clear(Color.DarkBlue)
Dim rnd As Random = New Random()
Dim points(60) As Point
'Създаваме произволни координати, които ще ползваме за да начертаем
'graphics.DrawBeziers(pen0, points) по-късно
For i As Integer = 0 To points.Length - 1
points(i) = New Point(CInt(rnd.Next(width)), CInt(rnd.Next(height)))
Next
'създаваме различни Pen с които да нашарим нашия Bitmap
Dim pen0 As Pen = New Pen(Color.PaleVioletRed)
pen0.Width = 2
pen0.DashStyle = Drawing2D.DashStyle.Dot
Dim pen1 As Pen = New Pen(Color.OldLace)
pen1.Width = 3
pen1.DashStyle = Drawing2D.DashStyle.Dash
Dim pen2 As Pen = New Pen(Color.PaleGreen)
pen2.Width = 4
pen2.DashStyle = Drawing2D.DashStyle.Dash
Dim pen3 As Pen = New Pen(Color.PaleGreen)
pen3.Width = 4
pen3.DashStyle = Drawing2D.DashStyle.Dash
Dim pen4 As Pen = New Pen(Color.PaleGreen)
pen4.Width = 4
pen4.DashStyle = Drawing2D.DashStyle.DashDotDot
'и нашарваме картинката
graphics.DrawLine(pen1, 0, 1, height, width)
graphics.DrawLine(pen2, 0, 1, width, height)
graphics.DrawLine(pen3, 5, 1, rnd.Next(height), rnd.Next(width))
graphics.DrawLine(pen4, 1, 5, rnd.Next(height), rnd.Next(width))
graphics.DrawBeziers(pen0, points)
graphics.DrawString(text, f, New SolidBrush(Color.White), 0, 0)
graphics.Flush()
' връща получения Bitmap с нашия CAPTCHA текст
Return b
Catch ex As Exception
Throw (New Exception("Captcha.vb > DrawText()", ex))
End Try
End Function
Сега остава да направим една ASPX страница която ще съдържа единствено Page_Load събитие в codebehind файла:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Try
'извикваме функцията, която връща картинка с текста
Dim b As Bitmap = Captcha.DrawText(Request.QueryString("text"))
Dim tempStream As System.IO.MemoryStream = New System.IO.MemoryStream()
b.Save(tempStream, System.Drawing.Imaging.ImageFormat.Gif)
Response.AddHeader("Content-Disposition", "inline; filename=captcha.gif")
Response.ContentType = "gif"
Response.BinaryWrite(tempStream.ToArray())
Catch ex As Exception
Log(ex, "GetCaptcha.aspx.vb > Page_Load()", "Request.QueryString(text) = " & Request.QueryString("text"))
Throw New Exception("GetCaptcha.aspx.vb > Page_Load()", ex)
End Try
End Sub
Тази страница ще използваме по-късно като ImageUrl на Image control в страницата където искаме да покажем нашите анти-бот цифрички и текст:)
Protected Sub DisplayCaptcha()
'създаваме произволно число (в случая, може и текст), което запазваме като
'ViewStatе("captcha") за да го сравним по-късно с това което е въвел потребителя
Dim rnd As Random = New Random()
ViewState("captcha") = rnd.Next(10000)
ImageCaptcha.ImageUrl = "GetCaptcha.aspx?text=" & ViewState("captcha")
End Sub
И това е! Както виждате е съвсем лесно да направим собствена анти бот CAPTCHA система, без да е нужно да ползваме готови и дори платени компоненти.
Visual Studio 2008 забива след като инсталирате Office 2010
Понякога Visual Studio 2008 може за забие когато се опитвате да редактирате aspx файл. Ако скоро преди това сте инсталирали Office 2010 решението на проблема е следното:
трябва да извършите Repair на “Microsoft Visual Studio Web Authoring Component” който е част от Office 2007. Предполагам, че по някаква причина новата инсталация подменя компонента.
отворете:
Windows 64bit
C:\Program Files (x86)\Common Files\microsoft shared\OFFICE12\Office Setup Controller\Setup.exe
Windows 32bit
C:\Program Files\Common Files\microsoft shared\OFFICE12\Office Setup Controller\Setup.exe
и направете Repair
трябва да извършите Repair на “Microsoft Visual Studio Web Authoring Component” който е част от Office 2007. Предполагам, че по някаква причина новата инсталация подменя компонента.
отворете:
Windows 64bit
C:\Program Files (x86)\Common Files\microsoft shared\OFFICE12\Office Setup Controller\Setup.exe
Windows 32bit
C:\Program Files\Common Files\microsoft shared\OFFICE12\Office Setup Controller\Setup.exe
и направете Repair
Етикети:
visual,
Visual Studio 2008,
забива,
инсталирате Office 2010
is not a valid Win32 application. (Exception from HRESULT: 0x800700C1) Exception Details: System.BadImageFormatException: is not a valid Win32 applica
Ако сте попадали на тази грешка, най-вероятно сте направили едно следните неща:
конвертирали сте проект от 1.1 към 2.0 или ползвате 64 битова машина.
Решението е съвсем просто:
1. При Windows 7 в IIS (7) отворете Application Pools.
2. Намерете Application Pool-а който ползва приложението ви.
3. Изберете го, и след това отворете Advanced Settings вдясно.
4. Включете втората опция: Enable 32-Bit Applications.
конвертирали сте проект от 1.1 към 2.0 или ползвате 64 битова машина.
Решението е съвсем просто:
1. При Windows 7 в IIS (7) отворете Application Pools.
2. Намерете Application Pool-а който ползва приложението ви.
3. Изберете го, и след това отворете Advanced Settings вдясно.
4. Включете втората опция: Enable 32-Bit Applications.
Как да стартираме Edit Event в GridVIew когато ръчно задаваме DataSource
Ако ръчно зададем DataSource на GridView, не можем да стартираме Edit Event. Дори да имаме създаден например LinkButton в TemplateField, който има:
CommandName="Edit"
при клик той ще вдигне RowEditing събитие, и ще получим следната грешка:
The GridView 'GridView' fired event RowEditing which wasn't handled.
Ако след това добавим EventHandler
Protected Sub GridViewBudgets_RowEditing(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewEditEventArgs) Handles GridViewBudgets.RowEditing
End Sub,
няма да се случи нищо и нашата GridView няма да влезе в EditMode.
Решението на проблема е следното:
В Protected Sub GridViewBudgets_RowEditing метода, трябва да добавим следните два реда:
GridViewBudgets.EditIndex = e.NewEditIndex()
BindGrid() - Метод който задава DataSource на GridView.
CommandName="Edit"
при клик той ще вдигне RowEditing събитие, и ще получим следната грешка:
The GridView 'GridView' fired event RowEditing which wasn't handled.
Ако след това добавим EventHandler
Protected Sub GridViewBudgets_RowEditing(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewEditEventArgs) Handles GridViewBudgets.RowEditing
End Sub,
няма да се случи нищо и нашата GridView няма да влезе в EditMode.
Решението на проблема е следното:
В Protected Sub GridViewBudgets_RowEditing метода, трябва да добавим следните два реда:
GridViewBudgets.EditIndex = e.NewEditIndex()
BindGrid() - Метод който задава DataSource на GridView.
26 март 2010, петък
Разликата между INNER, LEFT и RIGHT JOIN
Ако имаме следните две таблици: demo_people и demo_property
select * from demo_peopleINNER JOIN прави пълен JOIN, както в първия пример, а ключовите думи OUTER може да бъдат добавени след LEFT или RIGHT, в последните два примера. Те са добавени единствено за съвместимост с ODBC и нямат допълнителна функция.
+------------+--------------+------+
| name | phone | pid |
+------------+--------------+------+
| Mr Brown | 01225 708225 | 1 |
| Miss Smith | 01225 899360 | 2 |
| Mr Pullen | 01380 724040 | 3 |
+------------+--------------+------+
select * from demo_property
+------+------+----------------------+
| pid | spid | selling |
+------+------+----------------------+
| 1 | 1 | Old House Farm |
| 3 | 2 | The Willows |
| 3 | 3 | Tall Trees |
| 3 | 4 | The Melksham Florist |
| 4 | 5 | Dun Roamin |
+------+------+----------------------+
Ако направим обикновен JOIN (без ключовите думи INNER, OUTER, LEFT или RIGHT),
тогава получаваме всички записи които си съотвестват по ключовите колонки pid и
тези които не си сътовестват не се показват:
select name, phone, selling
from demo_people join demo_property
on demo_people.pid = demo_property.pid
+-----------+--------------+----------------------+
| name | phone | selling |
+-----------+--------------+----------------------+
| Mr Brown | 01225 708225 | Old House Farm |
| Mr Pullen | 01380 724040 | The Willows |
| Mr Pullen | 01380 724040 | Tall Trees |
| Mr Pullen | 01380 724040 | The Melksham Florist |
+-----------+--------------+----------------------+
Ако направим LEFT JOIN получаваме всички колонки, които си сътвестват И ДОПЪЛНИТЕЛНО
записите, които не си съответстват по ключ от лявата таблица на JOIN-a - или в нашия случай
получаваме всички хора въпреки, че някои от тях нямат имение във втората таблица, която свързваме.
select name, phone, selling
from demo_people left join demo_property
on demo_people.pid = demo_property.pid
+------------+--------------+----------------------+
| name | phone | selling |
+------------+--------------+----------------------+
| Mr Brown | 01225 708225 | Old House Farm |
| Miss Smith | 01225 899360 | NULL |
| Mr Pullen | 01380 724040 | The Willows |
| Mr Pullen | 01380 724040 | Tall Trees |
| Mr Pullen | 01380 724040 | The Melksham Florist |
+------------+--------------+----------------------+
Ако направя RIGHT JOIN, получавам всички записи които съотвестват по ключ от двете таблици,
и допълнително всички колонки, които не сътвестват от дясната таблица (таблицата с именията),
дори да няма сътвестващ по pid човек от първата таблица.
select name, phone, selling
from demo_people right join demo_property
on demo_people.pid = demo_property.pid
+-----------+--------------+----------------------+
| name | phone | selling |
+-----------+--------------+----------------------+
| Mr Brown | 01225 708225 | Old House Farm |
| Mr Pullen | 01380 724040 | The Willows |
| Mr Pullen | 01380 724040 | Tall Trees |
| Mr Pullen | 01380 724040 | The Melksham Florist |
| NULL | NULL | Dun Roamin |
+-----------+--------------+----------------------+
Етикети:
INNER JOIN,
JOIN,
LEFT OUTER JOIN,
MSSQL JOIN,
RIGHT JOIN,
SQL,
SQL JOIN
Абонамент за:
Публикации (Atom)
Архив на блога
-
▼
2010
(12)
-
►
Март
(6)
- Разликата между INNER, LEFT и RIGHT JOIN
- Изключване на дебъгването на скриптов код във Visu...
- Сайт за планиране на лични финанси, месечен/семеен...
- Управление на Windows Services на отдалечени машин...
- Приложение за намиране на изход от произволно създ...
- ASP.NET тагове: (<%$, <%=, <%, <%#, и т.н.) Им...
-
►
Март
(6)