Я использую класс для этого, его разработанный для измерения времени, потраченного, чтобы выполнить функцию и записать, что к uth-16le текстовому файлу (я должен обновить это для использования нового класса, который я сделал для этого..., но nm).
Создают новый экземпляр во главе функции, например, jProfiler (L "myFunction") и очистка в конце функции сделает остальных, если Вы захотите быть уверенными, хотя новый и удаляют его сами. Это - немного излишества для маленького теста, но могло бы помочь:
// start header
/* jProfiler class by Semi Essessi
*
* (class description goes here)
*
*/
#ifndef __JPROFILER_H
#define __JPROFILER_H
#include <stdio.h>
#include <windows.h>
class jProfiler
{
private:
wchar_t* str;
LARGE_INTEGER start;
LARGE_INTEGER tps;
LARGE_INTEGER buf;
static FILE* f;
static int instCount;
static void Initialise();
static void Shutdown();
public:
jProfiler(const wchar_t* msg);
~jProfiler();
};
#endif
// - end header
/* jProfiler class by Semi Essessi
*
* (class description goes here)
*
*/
#include "jProfiler.h"
#include <windows.h>
FILE* jProfiler::f = 0;
int jProfiler::instCount = 0;
jProfiler::jProfiler(const wchar_t* msg)
{
// constructor code for menuVar
int i = (int)wcslen(msg)+1;
str = new wchar_t[i];
memcpy(str, msg, sizeof(wchar_t)*i);
str[i-1] = 0;
QueryPerformanceFrequency(&tps);
QueryPerformanceCounter(&start);
instCount++;
Initialise();
}
jProfiler::~jProfiler()
{
// destructor code for menuVar
QueryPerformanceCounter(&buf);
// work out change in time
double dt=((float)buf.QuadPart - (float)start.QuadPart)/(float)tps.QuadPart;
fwprintf(f, L"%s : %.20f\r\n", str, dt);
if(str) delete[] str;
instCount--;
Shutdown();
}
void jProfiler::Initialise()
{
if(!f)
{
f = _wfopen(L"profilerlog.txt", L"wb");
unsigned short a = 0xFEFF;
fwrite(&a, sizeof(unsigned short), 1, f);
}
}
void jProfiler::Shutdown()
{
if(instCount==0) if(f) fclose(f);
}
Вы можете выполнить этот простой пример для редактируемого DropDownlist в проекте кода , который использует стандартные элементы управления ASP.NET TextBox и DropDownList в сочетании с некоторым JavaScript.
Однако код не работал у меня, пока я не добавил ссылку, чтобы получить значения ClientID для TextBox и DropDownList:
<script language="javascript" type="text/javascript">
function DisplayText()
{
var textboxId = '<% = txtDisplay.ClientID %>';
var comboBoxId = '<% = ddSelect.ClientID %>';
document.getElementById(textboxId).value = document.getElementById(comboBoxId).value;
document.getElementById(textboxId).focus();
}
</script>
<asp:TextBox style="width:120px;position:absolute" ID="txtDisplay" runat="server"></asp:TextBox>
<asp:DropDownList ID="ddSelect" style="width:140px" runat="server">
<asp:ListItem Value="test1" >test1</asp:ListItem>
<asp:ListItem Value="test2">test2</asp:ListItem>
</asp:DropDownList>
Наконец, в коде позади, как и в исходном примере, я добавил следующее для загрузки страницы:
protected void Page_Load(object sender, EventArgs e)
{
ddSelect.Attributes.Add("onChange", "DisplayText();");
}
Я поместил весь вышеуказанный код в отдельный ASCX Пользовательский контроль, чтобы сделать его многоразовым в моем проекте. Однако представленный выше код работает только в том случае, если вам требуется только один редактируемый DropDownList на данной странице.
Если вам нужно поддерживать несколько настраиваемых элементов управления DropDownList на одной странице, необходимо установить уникальное имя функции JavaScript, чтобы избежать конфликтов. Сделайте это, еще раз используя ClientID:
в файле ASCX:
function DisplayText_<% = ClientID %>(){...}
в коде позади:
/// ...
ddSelect.Attributes.Add("onChange", "DisplayText_" + ClientID + "();");
///..
Это один из способов избежать использования сторонних элементов управления.