четверг, 25 июля 2013 г.
пятница, 19 октября 2012 г.
вторник, 17 апреля 2012 г.
Эмуляция "Прогресса выполнения" или как показать этот самый прогресс для полного ПостБека(Full PostBack) в АпдейтПанели(UpdatePanel)
Исходные данные.
У нас имеется АпдейтПанель(UpdatePanel). В этой АпдейтПанели у нас две кнопки. По нажатию на каждую кнопку приложение делает что-то. Также у нас имеется АпдейтПрогрес(UpdateProgress) для нашей панели. НО одна из кнопок генерирует полный ПостБек (PostBack).
Также у нас имеется контрол Preloader.ascx который отображает какую-то информацию пока происходит обработка и выполнение запроса.
Согласно исходным данным, при нажатии кнопки btnWithPostBackTrigger мы не увидим никакой так называемой "ПрогрессИнформации". Если же мы нажмем на другую кнопку то мы увилим эту "ПрогрессИнформацию". Но это не очень удобно... В одном случае приложение информирует нас о том что оно что-то делает, в другом нет. Хотя в обоих случаях приложение занято какими-то вычислениями. Было бы гораздо удобнее информировать пользователя о работе приложения в обоих случаях, вне зависимости от типов постбека.
Исследование.
Существуют различные способы решить эту проблему. Но я предпочитаю использовать самый простой (для меня) сопособ. И это эмуляция отображения "ПрогрессИнформации" для АпдейтПанели.
Решение.
Идея в следующем - запускать клиентский код (JavaScript) по нажатию на нашу btnWithPostBackTrigger. В любом случае этот код будет запущен и исполнен до того момента как запрос уйдет на сервер, обработается там, и вернется назад. Мы нажимаем кнопку и посредством нашего клиентского кода показываем "ПрогрессИнформацию". И пока запрос не вернулся от сервера мы видим нашу "ПрогрессИнформацию". При таком подходе нам также не надо думать о том как прятать "ПрогрессИнформацию" когда все закончится, потому что когда запрос вернется от сервера - вся страница полностью перерисуется (у нас полный постбек) . А так как "ПрогрессИнформацию" у нас по умолчанию спрятана - то она исчезнет автоматически после перерисовки страницы.
Измения в .vbфале...
English version of this post >>
to sources >>
WWW.LANTERIA.COM
У нас имеется АпдейтПанель(UpdatePanel). В этой АпдейтПанели у нас две кнопки. По нажатию на каждую кнопку приложение делает что-то. Также у нас имеется АпдейтПрогрес(UpdateProgress) для нашей панели. НО одна из кнопок генерирует полный ПостБек (PostBack).
<%@ Page Title="Home Page"
Language="vb"
MasterPageFile="~/Site.Master"
AutoEventWireup="false"
CodeBehind="Default.aspx.vb"
Inherits="UpdatePanelProgressEmulation._Default"
%>
<%-- It is registration for a web user control that
include presentation layout of our progress information. --%>
<%@ Register
src="Preloader.ascx" tagname="Preloader" tagprefix="uc1" %>
<asp:Content ID="BodyContent"
runat="server"
ContentPlaceHolderID="MainContent">
<asp:ScriptManager ID="ScriptManagerMain"
unat="server"></asp:ScriptManager>
<asp:UpdatePanel ID="UpdatePanelMain"
runat="server">
<Triggers>
<%--Register our full
postback action for button--%>
<asp:PostBackTrigger ControlID="btnWithPostBackTrigger" />
</Triggers>
<ContentTemplate>
<%--UpdateProgress -
uses ucPreloader. As in the above code.--%>
<asp:UpdateProgress ID="UpdateProgressMain" EnableViewState="false" AssociatedUpdatePanelID="UpdatePanelMain" runat="server">
<ProgressTemplate>
<uc1:Preloader
ID="ucPreloader"
ClientIDMode="Static" runat="server" />
</ProgressTemplate>
</asp:UpdateProgress>
<asp:Button runat="server" ID="btnWithoutPostBackTrigger" Text="Button without
PostBackTrigger " BackColor="#006600" BorderStyle="Solid" BorderColor="#003300" ForeColor="White"/>
<asp:Button runat="server" ID="btnWithPostBackTrigger" Text="Button with
PostBackTrigger" BackColor="#CC0000" BorderStyle="Solid"
BorderColor="Maroon"
ForeColor="White"
/>
</ContentTemplate>
</asp:UpdatePanel>
</asp:Content>Также у нас имеется контрол Preloader.ascx который отображает какую-то информацию пока происходит обработка и выполнение запроса.
<%--A simple Div that shows us "Loading"
message.--%>
<div style="top:150px; width:100%; left:0px; display:block;position:fixed; z-index:2000;" align="center" >
<table style=" width:600px; height:200px; z-index:2002; background-color:#f9f9f9; border-style:solid; border-color:Grey; ">
<tr>
<td valign="middle" align="center">
<h1 style=" color:Navy">Loading: 5000 milliseconds...</h1>
</td>
</tr>
</table>
</div>Согласно исходным данным, при нажатии кнопки btnWithPostBackTrigger мы не увидим никакой так называемой "ПрогрессИнформации". Если же мы нажмем на другую кнопку то мы увилим эту "ПрогрессИнформацию". Но это не очень удобно... В одном случае приложение информирует нас о том что оно что-то делает, в другом нет. Хотя в обоих случаях приложение занято какими-то вычислениями. Было бы гораздо удобнее информировать пользователя о работе приложения в обоих случаях, вне зависимости от типов постбека.
Исследование.
Существуют различные способы решить эту проблему. Но я предпочитаю использовать самый простой (для меня) сопособ. И это эмуляция отображения "ПрогрессИнформации" для АпдейтПанели.
Решение.
Идея в следующем - запускать клиентский код (JavaScript) по нажатию на нашу btnWithPostBackTrigger. В любом случае этот код будет запущен и исполнен до того момента как запрос уйдет на сервер, обработается там, и вернется назад. Мы нажимаем кнопку и посредством нашего клиентского кода показываем "ПрогрессИнформацию". И пока запрос не вернулся от сервера мы видим нашу "ПрогрессИнформацию". При таком подходе нам также не надо думать о том как прятать "ПрогрессИнформацию" когда все закончится, потому что когда запрос вернется от сервера - вся страница полностью перерисуется (у нас полный постбек) . А так как "ПрогрессИнформацию" у нас по умолчанию спрятана - то она исчезнет автоматически после перерисовки страницы.
Теперь небольшие измения висходном коде для реализации всего вышеописанного...
<div id="divPreloader"
style="visibility:hidden;">
<uc1:Preloader
ID="ucPre" runat="server" />
</div>
Добавляем этот код где-то за пределами АпдейтПанели. Это то что пользователь будет видеть при полном постбеке. Я расположил его над АпдейтПанелью. Мы будем находить и показывать этот див с помощь клиенсткого скрипта.
И добавим OnClientClick="ShowProgress('divPreloader')" к нашей кнопке btnWithPostBackTrigger. в нашем случае ShowProgress - это название джаваскриптовой функции которая будет показывать то, что нам надо.
Измения в .vbфале...
Private Sub Page_Load(sender As
Object, e As
System.EventArgs) Handles Me.Load
Dim
PageLoadedHandlerScript As String = " function
getObject (sId) { if(!sId) return null; else if (document.all &&
document.all[sId]) return
document.all[sId]; else if
(document.getElementById) return
document.getElementById(sId); else return null;}" _
& "
function ShowProgress(sId) { var dP = getObject(sId); if (dP != null) {
dP.style.visibility = 'visible'; } }"
Page.ClientScript.RegisterClientScriptBlock(Me.GetType,
"getObjectScript",
PageLoadedHandlerScript, True)
btnWithPostBackTrigger.OnClientClick = "ShowProgress('divPreloader')"
End Sub
В этом куске кода мы регистрируем клиентский скрипт на странице. В нем две функции. Первая функция ищет DOM обьект на странице. Вторая функция показывает найденный див. Если хотите используйте свой собственный JavaScript и jQuery.
Вот и все. Надеюсь это поможет вам.
English version of this post >>
to sources >>
WWW.LANTERIA.COM
понедельник, 19 марта 2012 г.
Экспорт в excel/word возвращает пустой документ или снова проблемы с ReportViewer 2010 в SharePoint 2010
Исходные данные.
Исходные данные такие же как и в предыдущем сощбщении: SharePoint 2010 -> Visual Web Part -> UpdatePanel -> Microsoft Report Viewer 2010.
Ситуация.
MRV 2010 корректно генерирует рапорт на страничке в своей секции. НО когда мы тыцаем на "Export to Excel/Word" и пытаемя открыть сгенерированный документ, то во-первых мы получаем следущее предупреждение "The file you are trying to open '<FileName.xls>', is in a different format than specified by the file extension. Verify that the file is not corrupted and is from a trusted source before opening the file. Do you want to open the file now?". Во-вторых - если мы соглашаемся открыть документ - то получаем пустоту размером в 0 кб.
Исследование.
Если залогиниться как пользователь который имеет админские права на сервере и сэкспортировать документ в вышеуказанные форматы - то все хорошо. Никаких предупреждений. Да и документы не пустые. Но стоит только зайти как обычный пользователь - "Хьюстон, у нас проблемы". Так что проблемы где-то в правах на сервере.
Посредством полезной утилитки Procees Monitor обнаружил что Network Service имеет ошибку записи при попытке записать екселевский файлик в некоторый каталог. Это был знак.
Решение.
Вот этот каталог - "C:\Windows\ServiceProfiles\NetworkService\AppData\Local\Temp". Для того чтоб решить эту проблему достаточно было добавить пользователя "Authenticated Users" с правами "Full Control " на эту директорию.
НО! Это не совсем правильный ответ.... Каталог описанный выше - это всего лишь частный случай... На самом деле нужно сделать следущее - добавить пользователя "Authenticated Users" с правами "Full Control " на временную директорию аккаунта под которым выполняется Пул вашего веб-приложения. У меня Пул запускался как Network Service - так что вышеописанная директория мне подошла. Но если ваш пул запускается, например, под пользователем "Administrator.Office" - то возможно, вам понадобится эта директория: C:\Users\Administrator.OFFICE\AppData\Local\Temp. Да, и делайте все это на сервере, а не на локальной машине.
English version of this post >>
WWW.LANTERIA.COM
Исходные данные такие же как и в предыдущем сощбщении: SharePoint 2010 -> Visual Web Part -> UpdatePanel -> Microsoft Report Viewer 2010.
Ситуация.
MRV 2010 корректно генерирует рапорт на страничке в своей секции. НО когда мы тыцаем на "Export to Excel/Word" и пытаемя открыть сгенерированный документ, то во-первых мы получаем следущее предупреждение "The file you are trying to open '<FileName.xls>', is in a different format than specified by the file extension. Verify that the file is not corrupted and is from a trusted source before opening the file. Do you want to open the file now?". Во-вторых - если мы соглашаемся открыть документ - то получаем пустоту размером в 0 кб.
Исследование.
Если залогиниться как пользователь который имеет админские права на сервере и сэкспортировать документ в вышеуказанные форматы - то все хорошо. Никаких предупреждений. Да и документы не пустые. Но стоит только зайти как обычный пользователь - "Хьюстон, у нас проблемы". Так что проблемы где-то в правах на сервере.
Посредством полезной утилитки Procees Monitor обнаружил что Network Service имеет ошибку записи при попытке записать екселевский файлик в некоторый каталог. Это был знак.
Решение.
Вот этот каталог - "C:\Windows\ServiceProfiles\NetworkService\AppData\Local\Temp". Для того чтоб решить эту проблему достаточно было добавить пользователя "Authenticated Users" с правами "Full Control " на эту директорию.
НО! Это не совсем правильный ответ.... Каталог описанный выше - это всего лишь частный случай... На самом деле нужно сделать следущее - добавить пользователя "Authenticated Users" с правами "Full Control " на временную директорию аккаунта под которым выполняется Пул вашего веб-приложения. У меня Пул запускался как Network Service - так что вышеописанная директория мне подошла. Но если ваш пул запускается, например, под пользователем "Administrator.Office" - то возможно, вам понадобится эта директория: C:\Users\Administrator.OFFICE\AppData\Local\Temp. Да, и делайте все это на сервере, а не на локальной машине.
English version of this post >>
WWW.LANTERIA.COM
пятница, 17 февраля 2012 г.
Проблемы ReportViewer2010 + UpdatePanel + SharePoint2010 в Chrome и Safary или Uncaught Sys.ScriptLoadFailedException: Sys.ScriptLoadFailedException: The script '.....' could not be loaded. Uncaught TypeError: Cannot read property '_notified' of null.
Исходные данные.
Имеем ВебПарт(WebPart) для SharePoint2010. В этом вебпарте находится АпдейтПанель (UpdatePanel). В апдейтпанели имеем соответственно РепортВьювер10 (ReportViewer 10).
Ситуация.
В IE9.0 и Firefox рапорт отображается корректно. А вот в Chrome и Safari ничего не отображается. Вернее отображается НЕ активный репортвьювер контрол, без контента. Причем если убираем апдейтпанель - то рапорт начинает корректно отображаться во всех броузерах. При попытке смоделировать подобную ситуацию посредством обычного веб-сайта созданного через VS2010 (апдейт панель + репорт вьювер) никаких ошибок не возникает. А вот в SharePoint2010 имеется...
Исследование.
Через хромовый девелопер тул (F12) определил что возикает две джаваскриптовые ошибки
Решение.
Порывшись в инете нашел что подобная ошибка возникает частенько с этими браузерами при использовнии UpdatePanel/AjaxToolkit - все что использует ScriptManager. MicrosoftAjax одним словом... Проблема заключается в том что в MicrosoftAjaxWebForms.js не корректно определяются WebKit-овские броузеры. Если добавить на страницу следующий код :
Sys.Browser.WebKit = {};
if (navigator.userAgent.indexOf('WebKit/') > -1) {
Sys.Browser.agent = Sys.Browser.WebKit;
Sys.Browser.version = parseFloat(navigator.userAgent.match(/WebKit\/(\d+(\.\d+)?)/)[1]);
Sys.Browser.name = 'WebKit';
}
то все начинает работать корректно. Такое впечатление что корректный джаваскрипт для работы этих броузеров присутствует, а вот определитель работает не корретно. В общем эти строчки решили проблему. Но остается вопрос - почему это происходило в SharePoint2010 и не просходило на простом вебсайте. Единственное обьяснение которое я вижу - это то что используются различные версии аджаксовых скриптов для этих продуктов.
Имеем ВебПарт(WebPart) для SharePoint2010. В этом вебпарте находится АпдейтПанель (UpdatePanel). В апдейтпанели имеем соответственно РепортВьювер10 (ReportViewer 10).
Ситуация.
В IE9.0 и Firefox рапорт отображается корректно. А вот в Chrome и Safari ничего не отображается. Вернее отображается НЕ активный репортвьювер контрол, без контента. Причем если убираем апдейтпанель - то рапорт начинает корректно отображаться во всех броузерах. При попытке смоделировать подобную ситуацию посредством обычного веб-сайта созданного через VS2010 (апдейт панель + репорт вьювер) никаких ошибок не возникает. А вот в SharePoint2010 имеется...
Исследование.
Через хромовый девелопер тул (F12) определил что возикает две джаваскриптовые ошибки
1.Uncaught Sys.ScriptLoadFailedException: Sys.ScriptLoadFailedException: The script '....' could not be loaded.
2. Uncaught TypeError: Cannot read property '_notified' of null
и все это в файле MicrosoftAjaxWebForms.js...Решение.
Порывшись в инете нашел что подобная ошибка возникает частенько с этими браузерами при использовнии UpdatePanel/AjaxToolkit - все что использует ScriptManager. MicrosoftAjax одним словом... Проблема заключается в том что в MicrosoftAjaxWebForms.js не корректно определяются WebKit-овские броузеры. Если добавить на страницу следующий код :
Sys.Browser.WebKit = {};
if (navigator.userAgent.indexOf('WebKit/') > -1) {
Sys.Browser.agent = Sys.Browser.WebKit;
Sys.Browser.version = parseFloat(navigator.userAgent.match(/WebKit\/(\d+(\.\d+)?)/)[1]);
Sys.Browser.name = 'WebKit';
}
то все начинает работать корректно. Такое впечатление что корректный джаваскрипт для работы этих броузеров присутствует, а вот определитель работает не корретно. В общем эти строчки решили проблему. Но остается вопрос - почему это происходило в SharePoint2010 и не просходило на простом вебсайте. Единственное обьяснение которое я вижу - это то что используются различные версии аджаксовых скриптов для этих продуктов.
English version of this post >>
WWW.LANTERIA.COM
вторник, 14 февраля 2012 г.
ASP.NET 4.0 ClientID Overview
Четкие статьи описывающие различные принципы формирования/использования ClientID для контролов сгенерированных ASP.NET на клиентской стороне.
ССЫЛКА НА СТАТЬЮ №1 >>
ССЫЛКА НА СТАТЬЮ №2 >>
ССЫЛКА НА СТАТЬЮ №1 >>
ССЫЛКА НА СТАТЬЮ №2 >>
WWW.LANTERIA.COM
вторник, 24 января 2012 г.
вторник, 29 ноября 2011 г.
I FADE...
I'm plagued by the silence
You brought upon me
Suffering in the desolate laps of time
Tearing the flesh from my bones
Endless eternity awaits
Smothered by life
Emptiness takes hold
Eternity shines brighter
Than ever before
I'm lost with despair
No one's left to care
Alone, abandoned
To die by myself...
Endless eternity awaits
You brought upon me
Suffering in the desolate laps of time
Tearing the flesh from my bones
Endless eternity awaits
Smothered by life
Emptiness takes hold
Eternity shines brighter
Than ever before
I'm lost with despair
No one's left to care
Alone, abandoned
To die by myself...
Endless eternity awaits
вторник, 22 ноября 2011 г.
JavaScript ошибка "zofnhot=ofnh.offsetTop*zm" при генерации отчета в Microsoft Report Viewer
Вобщем поймал я эту хрень , иначе не назовешь, при генерации простого рапорточка средствами Microsoft Report Viewer... Данные простые, таблица простая - и эта ошибка. Вообщем я не вникал почему она возникает, очень похоже на то что репортвьювер лагает где-то с определениями размеров... Проблема оказалась в повторяющихся хидерах/футерах, в настройках таблицы в рдлс файле.. убрал галочки - проблемы исчезли.
вторник, 30 августа 2011 г.
AS in C#
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Object st1 = new ST1();
string S1 = String.Empty;
{
class Program
{
static void Main(string[] args)
{
Object st1 = new ST1();
string S1 = String.Empty;
S1 = (String)st1;
S1 = st1 is String ? (String)st1 : null;
S1 = st1 as String;
}
}
}
}
//Empty class
public class ST1 { }
}
public class ST1 { }
}
S1 = (String)st1; - при отладке получим ошибку : "Unable to cast object of type 'ST1' to type 'System.String'."
S1 = st1 is String ? (String)st1 : null; - Сработает корректно.
S1 = st1 as String; - Сработает корректно.
S1 = st1 as String - всего лишь укороченный синтаксис для S1 = st1 is String ? (String)st1 : null;
пятница, 20 мая 2011 г.
SQL error: "Too many parameters were provided in this RPC request" или ошибка 2100 парметров в SQL запросе
Причиной этой ошибки является ограничение количества параметров который можно передать в SQL команду. Обычно данная ситуция возникает когда нужно вычитать список сущностей по идентификатору.
SELECT * FROM table WHERE Id = idValue1 OR Id = idValue2 OR Id = idValue3 ...OR Id = idValue3000
или
SELECT * FROM table WHERE Id IN (idValue1,idValue2,idValue3...idValue3000)
Возникает эта ситуация конечно не часто, но и она имеет место быть. Заявления вроде "Да как вы вообще допустили появления таких запрсов в системе!" - не принимаются. Различные системы, различные архитектурные ограничения... И вот, пожалуйста, все упирается в необходимость вычитать из базы 3000 сущностей по дентификатору...
Задача.
Имеется исходная коллекция идентификатов сущностей А. Коллекция может содежать больше 2100 элементов ( а може и меньше, но это не важно. Как и не важно то, как и откуда эта коллекция взялась. Она есть.). Необходимо вычитать из базы все сущности А, айдишники которых присутствуют в коллекции идентификаторов . Порядок вычитанных сущностей должен совпадать с порядком следования элементов в исходной коллекции идентификаторов.
Решение.
Продолжение следует...
SELECT * FROM table WHERE Id = idValue1 OR Id = idValue2 OR Id = idValue3 ...OR Id = idValue3000
или
SELECT * FROM table WHERE Id IN (idValue1,idValue2,idValue3...idValue3000)
Возникает эта ситуация конечно не часто, но и она имеет место быть. Заявления вроде "Да как вы вообще допустили появления таких запрсов в системе!" - не принимаются. Различные системы, различные архитектурные ограничения... И вот, пожалуйста, все упирается в необходимость вычитать из базы 3000 сущностей по дентификатору...
Задача.
Имеется исходная коллекция идентификатов сущностей А. Коллекция может содежать больше 2100 элементов ( а може и меньше, но это не важно. Как и не важно то, как и откуда эта коллекция взялась. Она есть.). Необходимо вычитать из базы все сущности А, айдишники которых присутствуют в коллекции идентификаторов . Порядок вычитанных сущностей должен совпадать с порядком следования элементов в исходной коллекции идентификаторов.
Решение.
Продолжение следует...
Вычитка коллекции по частям
Задача.
Есть типизированная коллекция. Необходимо производить последовательную вычитку коллекции по частям. Например, коллекция из 10 элементов. Последовательно вычитать первые 4 элемента, вторые 4 элемента и тд.
Решение.
Sub Main()
Dim l As New List(Of Integer)
l.Add(1) : l.Add(2) : l.Add(3) : l.Add(4) : l.Add(5) : l.Add(6) : l.Add(7) : l.Add(8) : l.Add(9) : l.Add(10)
Dim total As Integer = l.Count
Dim sizeOfPage As Integer = 4
Dim qantityOfPages As Integer = CInt(Math.Truncate(total / sizeOfPage))
For i As Integer = 0 To qantityOfPages
Dim startPos As Integer = i * sizeOfPage
Dim innerList As List(Of Integer) = l.Skip(startPos).Take(sizeOfPage).ToList
For Each ed In innerList
Console.WriteLine(ed.ToString)
Next
Console.WriteLine()
Next
Console.ReadLine()
End Sub
Ниже аналогичное решение, но полностью на foreach ... next и if ... end if
Sub Main()
Dim l As New List(Of Integer)
l.Add(1) : l.Add(2) : l.Add(3) : l.Add(4) : l.Add(5) : l.Add(6) : l.Add(7) : l.Add(8) : l.Add(9) : l.Add(10)
Dim total As Integer = l.Count
Dim sizeOfPage As Integer = 4
Dim qantityOfPages As Integer = CInt(Math.Truncate(total / sizeOfPage))
For i As Integer = 0 To qantityOfPages
Dim startPos As Integer = i * sizeOfPage
Dim endPos As Integer = startPos + sizeOfPage
For ed As Integer = startPos To endPos - 1
If ed < l.Count Then
Console.WriteLine(l.Item(ed).ToString)
Else
Exit For
End If
Next
Console.WriteLine()
Next
Console.ReadLine()
End Sub
в обоих случаях получаем следущее:
Есть типизированная коллекция. Необходимо производить последовательную вычитку коллекции по частям. Например, коллекция из 10 элементов. Последовательно вычитать первые 4 элемента, вторые 4 элемента и тд.
Решение.
Sub Main()
Dim l As New List(Of Integer)
l.Add(1) : l.Add(2) : l.Add(3) : l.Add(4) : l.Add(5) : l.Add(6) : l.Add(7) : l.Add(8) : l.Add(9) : l.Add(10)
Dim total As Integer = l.Count
Dim sizeOfPage As Integer = 4
Dim qantityOfPages As Integer = CInt(Math.Truncate(total / sizeOfPage))
For i As Integer = 0 To qantityOfPages
Dim startPos As Integer = i * sizeOfPage
Dim innerList As List(Of Integer) = l.Skip(startPos).Take(sizeOfPage).ToList
For Each ed In innerList
Console.WriteLine(ed.ToString)
Next
Console.WriteLine()
Next
Console.ReadLine()
End Sub
Ниже аналогичное решение, но полностью на foreach ... next и if ... end if
Sub Main()
Dim l As New List(Of Integer)
l.Add(1) : l.Add(2) : l.Add(3) : l.Add(4) : l.Add(5) : l.Add(6) : l.Add(7) : l.Add(8) : l.Add(9) : l.Add(10)
Dim total As Integer = l.Count
Dim sizeOfPage As Integer = 4
Dim qantityOfPages As Integer = CInt(Math.Truncate(total / sizeOfPage))
For i As Integer = 0 To qantityOfPages
Dim startPos As Integer = i * sizeOfPage
Dim endPos As Integer = startPos + sizeOfPage
For ed As Integer = startPos To endPos - 1
If ed < l.Count Then
Console.WriteLine(l.Item(ed).ToString)
Else
Exit For
End If
Next
Console.WriteLine()
Next
Console.ReadLine()
End Sub
в обоих случаях получаем следущее:
четверг, 19 мая 2011 г.
TextBox и Еnter
:)
Присутствовала некая форма. В этой форме присутсвовало некое текстовое поле - якобы "MultiLine".. визуально все нормально - выглядит как обычный "MultiLine" (в том смысле что "высокое и широкое" , ну обычная TextArea...) Но почему то при нажатии в текстовом поле Еnter на форме срабатывал постебек. Вместо того чтобы создавать новую строку в текстовом поле - форма отправлялась на сервер...
Первая мысль - блокировать реакцию на Enter... заблокировал .
Все отлично - Enter блокируется. Но и и новая строчка не создается...
Что за фигня...
В других то местах такой проблемы даже и не возникало...
Уже думаю писать более хитрый джавскрипт сценарий. И тут вижу - о чудо!
Текстовому полю размеры указаны как для могосторочного, но блин параметр TextMode="MultiLine" отсутствует. Отсюда и все проблемы. Устновил TextMode="MultiLine" - все проблемы прошли, и никакя блокировка не понадобилась. На Enter производится создание строчки и никаких постбеков.
Мораль - не копипастить бездумно.
Присутствовала некая форма. В этой форме присутсвовало некое текстовое поле - якобы "MultiLine".. визуально все нормально - выглядит как обычный "MultiLine" (в том смысле что "высокое и широкое" , ну обычная TextArea...) Но почему то при нажатии в текстовом поле Еnter на форме срабатывал постебек. Вместо того чтобы создавать новую строку в текстовом поле - форма отправлялась на сервер...
Первая мысль - блокировать реакцию на Enter... заблокировал .
Все отлично - Enter блокируется. Но и и новая строчка не создается...
Что за фигня...
В других то местах такой проблемы даже и не возникало...
Уже думаю писать более хитрый джавскрипт сценарий. И тут вижу - о чудо!
Текстовому полю размеры указаны как для могосторочного, но блин параметр TextMode="MultiLine" отсутствует. Отсюда и все проблемы. Устновил TextMode="MultiLine" - все проблемы прошли, и никакя блокировка не понадобилась. На Enter производится создание строчки и никаких постбеков.
Мораль - не копипастить бездумно.
среда, 11 мая 2011 г.
Коварный код: Советы и приемы по UpdatePanel.
Нашел вот интересную статью об использовании UpdatePanel.
Сам люблю юзать этот контрол.
Дает дополнительное понимание использования.
http://msdn.microsoft.com/ru-ru/magazine/cc163413.aspx
Сам люблю юзать этот контрол.
Дает дополнительное понимание использования.
http://msdn.microsoft.com/ru-ru/magazine/cc163413.aspx
четверг, 13 января 2011 г.
ListView , Paging ( DataPager) и как обнулить индекс страницы для пейджинга.
Для того чтобы заполучить в свое распоряжение разбивку на страницы ( Paging ) в ListView необходимо использовать контрол DataPager. DataPager может быть расподожен как пределах ListView в LayoutTemplate так и за пределами ListView . Но тогда для DataPager необходимо установить свойство PagedControlID которое будет указывать на наш ListView. Ниже два примера использования.
Внутри ListView
<asp:ListView ID="ListView1" runat="server">
<LayoutTemplate>
<ul>
<asp:PlaceHolder runat="server" ID="itemPlaceholder" />
</ul>
<asp:DataPager ID="Pager1" runat="server" PageSize="40">
<Fields>
<asp:NumericPagerField />
</Fields>
</asp:DataPager>
</LayoutTemplate>
<ItemTemplate>
<li>
<asp:Literal ID="litContent" runat="server"/>
</li>
</ItemTemplate>
</asp:ListView>
За Пределами ListView
<asp:ListView ID="ListView1" runat="server">
<LayoutTemplate>
<ul>
<asp:PlaceHolder runat="server" ID="itemPlaceholder" />
</ul>
</LayoutTemplate>
<ItemTemplate>
<li>
<asp:Literal ID="litContent" runat="server"/>
</li>
</ItemTemplate>
</asp:ListView>
<asp:DataPager ID="Pager1" PagedControlID="ListView1" runat="server" PageSize="40">
<Fields>
<asp:NumericPagerField />
</Fields>
</asp:DataPager>
Я предпочитаю использовать DataPager за пределами ListView. Все нижеописаноое будет относиться к этому варианту использования.
Итак дальше... Предоложим у нас имеется некая поисковая форма и кнопка "Искать". Пользователь вводит данные в форму и нажимает кнопку. По нажатию происходит выборка данных и наполнение ListView.
А теперь ситуация... Допустим по условиям выборки в ListView попадает 100 строк. Наш пейджинг ( с установкой в 40 записей ) разобьет все это дело на три страницы. Пользователь переходит на третью страницу, вводит новые параметры для поиска и опять нажимает "Искать". Теперь наша выборка содержит только 10 строк. Производим наполение ListView и видим только форму поиска и пейджинг - а самого ListView нет, хотя мы точно знаем, что данными он был наполнен.
Причина в том DataPager не был обнулен. Тоесть он по пережднему показывает на третью страницу, но ее уже нет. Вот и возникат конфликт.
Для решения этой проблемы , в нашем случае, в обработчике щелчка кноки нужно вызвать метод SetPageProperties нашего датапейджера.
Pager1.SetPageProperties(0, 40, True)
где первый параметр - стартовый индекс (индекмирование с 0), а второй - количество строк на странице.
Все. Теперь после каждого щелчка по кнопке "Искать" пользователь будет оказываться на первой странице нашего ListView, отображающего результаты поиска.
Внутри ListView
<asp:ListView ID="ListView1" runat="server">
<LayoutTemplate>
<ul>
<asp:PlaceHolder runat="server" ID="itemPlaceholder" />
</ul>
<asp:DataPager ID="Pager1" runat="server" PageSize="40">
<Fields>
<asp:NumericPagerField />
</Fields>
</asp:DataPager>
</LayoutTemplate>
<ItemTemplate>
<li>
<asp:Literal ID="litContent" runat="server"/>
</li>
</ItemTemplate>
</asp:ListView>
За Пределами ListView
<asp:ListView ID="ListView1" runat="server">
<LayoutTemplate>
<ul>
<asp:PlaceHolder runat="server" ID="itemPlaceholder" />
</ul>
</LayoutTemplate>
<ItemTemplate>
<li>
<asp:Literal ID="litContent" runat="server"/>
</li>
</ItemTemplate>
</asp:ListView>
<asp:DataPager ID="Pager1" PagedControlID="ListView1" runat="server" PageSize="40">
<Fields>
<asp:NumericPagerField />
</Fields>
</asp:DataPager>
Я предпочитаю использовать DataPager за пределами ListView. Все нижеописаноое будет относиться к этому варианту использования.
Итак дальше... Предоложим у нас имеется некая поисковая форма и кнопка "Искать". Пользователь вводит данные в форму и нажимает кнопку. По нажатию происходит выборка данных и наполнение ListView.
А теперь ситуация... Допустим по условиям выборки в ListView попадает 100 строк. Наш пейджинг ( с установкой в 40 записей ) разобьет все это дело на три страницы. Пользователь переходит на третью страницу, вводит новые параметры для поиска и опять нажимает "Искать". Теперь наша выборка содержит только 10 строк. Производим наполение ListView и видим только форму поиска и пейджинг - а самого ListView нет, хотя мы точно знаем, что данными он был наполнен.
Причина в том DataPager не был обнулен. Тоесть он по пережднему показывает на третью страницу, но ее уже нет. Вот и возникат конфликт.
Для решения этой проблемы , в нашем случае, в обработчике щелчка кноки нужно вызвать метод SetPageProperties нашего датапейджера.
Pager1.SetPageProperties(0, 40, True)
где первый параметр - стартовый индекс (индекмирование с 0), а второй - количество строк на странице.
Все. Теперь после каждого щелчка по кнопке "Искать" пользователь будет оказываться на первой странице нашего ListView, отображающего результаты поиска.
вторник, 4 января 2011 г.
Оптимизация отображения больших списков сущностей
Обнаружил в приложении определенную функциональность. Один из так называемых "ASAP" блоков. Суть в следующем - отображение больших списков сущностей ( А - сущность) и информации из сущностей связанных с сущностью A по некоторым критериям(сущности Б, С и Д). Сущности Б,С и Д связаны с сущностью А по определенным бизнес правилам. В результате время отображения полного списка из тысячи сущностей А и дополнительной информации из сущностей Б,С и Д составляло 4.5 минуты.
Даный результат достигался благодаря слудующему решению.
Даный результат достигался благодаря слудующему решению.
- Выбирался коллекция из сущностей A
- Полученная коллекция в цикле обрабатывалась и для каждой сущности A брались соответствующие сущности Б,С и Д. Даже при условии что на получение сущности Б,С или Д тратилось одно обращение к базе - получаем три тысячи обращений к базе.
- три тысячи одно обращение к базе - вот вам и четыре с половиной минуты.
- Выбирать коллекцию из сущностей A
- Выбирать коллекцию из всех сущностей Б которые связанны с сущностями из коллекции А.
- Выбирать коллекцию из всех сущностей С которые связанны с сущностями из коллекции А
- Выбирать коллекцию из всех сущностей Д которые связанны с сущностями из коллекции А
- Для каждого элемента из коллекции А выбирать соответствующие сущности Б,С и Д из уже наполненных коллекций посредством "LinQ to Object".
- 4 запроса к базе всместо 3001 - 4 секунды вместо 4,5 минут.
вторник, 30 ноября 2010 г.
Одна из определяющих характеристик MVC
ИСТОЧНИК: "Professional ASP.NET MVC 1.0 By Rob Conery, Scott Hanselman, Phil Haack, Scott Guthrie"
Одной из определяющих характеристик шаблона MVC является строгое "разделение понятий". Модели (Models), Контроллеры (Controllers) и Представления (Views) имеют
четко определеные роли и обязанности, и они общаются между собой по четко определенным правилам. Это улучшает тестируемость и повторное использование кода.
Когда клас контроллера решает вернуть НТML ответ обратно клиенту, он отвечает за точную передачу в шаблон представления всех данных необходимых для отображения этого ответа.
Шаблон представления (View template) никогда не должен выполнять каких либо действий связанных с извлечением данных или с бизнес логикой. Вместо этого Шаблон представления должен использоваться ТОЛЬКО для отображения данных полученных от Контроллера.
Одной из определяющих характеристик шаблона MVC является строгое "разделение понятий". Модели (Models), Контроллеры (Controllers) и Представления (Views) имеют
четко определеные роли и обязанности, и они общаются между собой по четко определенным правилам. Это улучшает тестируемость и повторное использование кода.
Когда клас контроллера решает вернуть НТML ответ обратно клиенту, он отвечает за точную передачу в шаблон представления всех данных необходимых для отображения этого ответа.
Шаблон представления (View template) никогда не должен выполнять каких либо действий связанных с извлечением данных или с бизнес логикой. Вместо этого Шаблон представления должен использоваться ТОЛЬКО для отображения данных полученных от Контроллера.
пятница, 26 ноября 2010 г.
HTML helper methods - like Html.TextBox() - check the ModelState collection when rendering output. If
an error for the item exists, they render the user-entered value and a CSS error class.
an error for the item exists, they render the user-entered value and a CSS error class.
вторник, 16 ноября 2010 г.
Автоматическое обновление Web-приложенния установленного на TabletPC (другой компьютер) через интернет.
Исходные данные.
Система, представляющая собой некое онлайн приложение. Система позволяет работать пользователю онлайн. Также присутствует некое приложение которое устанавливается на переносные ПК ( Tablet PC). Это приложение позволяет пользователю получать определенные данные от основной онлайн ситемы, обрабатывать их оффлайн (добавлять , модифицировать и тд. ) и возвращать эти данные в основную систему. Проще говоря - проводить онлайн сихронизацию.
Задача.
Так как основная система (как и ее база) подверженны изменениям, то при наступлении этих самых изменений необходимо автоматически обновлять приложения установленные на переносных ПК, для достижения целостности данных и прочая и прочая.
Продолжение следует...
Система, представляющая собой некое онлайн приложение. Система позволяет работать пользователю онлайн. Также присутствует некое приложение которое устанавливается на переносные ПК ( Tablet PC). Это приложение позволяет пользователю получать определенные данные от основной онлайн ситемы, обрабатывать их оффлайн (добавлять , модифицировать и тд. ) и возвращать эти данные в основную систему. Проще говоря - проводить онлайн сихронизацию.
Задача.
Так как основная система (как и ее база) подверженны изменениям, то при наступлении этих самых изменений необходимо автоматически обновлять приложения установленные на переносных ПК, для достижения целостности данных и прочая и прочая.
Продолжение следует...
Подписаться на:
Сообщения (Atom)
