Это исключение выдается, когда вы пытаетесь использовать метод WebElement, которого больше нет на странице. Если ваша сетка загружает данные динамически, и вы обновляете сетку, любые ссылки на элементы этой сетки будут «устаревшими». Дважды проверьте, что элемент, на который вы пытаетесь сослаться, находится на странице в ваших тестах, и вам может понадобиться создать экземпляр объекта.
Похоже, ответ был похоронен в комментариях к ViewManager
. Вам понадобится класс, который наследуется от Page и отменяет проверку серверных элементов управления не в форме
public class FormlessPage : Page
{
public override void VerifyRenderingInServerForm(Control control)
{
}
}
Затем, когда вы визуализируете элемент управления, используйте
Page page = new FormlessPage();
UserControl ctl = (UserControl)page.LoadControl(controlName);
//etc
, я предполагаю, что вы потеряете возможность запускать события из любых элементов управления, визуализированных таким образом.
Вы можете изменить свой метод GetControl ()
следующим образом:
private string GetControl(String controlName, String ClassId)
{
Page page = new Page();
StringWriter writer = new StringWriter();
page.Server.Execute(controlName, writer, false);
return writer.ToString();
}
Вместо использования скрытого элемента управления asp.net в пользовательском элементе управления просто используйте обычный скрытый ввод HTML с тегами кода <%%>, чтобы заполнить данные следующим образом:
<input id="Hidden1" type="hidden" value="<%= text %>"/>
"text" - это общедоступная переменная в коде, стоящем за файлом.
Это сработало для меня и не требовало формы с runat = "server"
.
<System.Web.Services.WebMethod()> _
Public Shared Function GetDetails(ByVal filename As String) As String
Dim page As Page = New Page()
Dim ctl As recDetails = CType(page.LoadControl("~/Controles/recDetails.ascx"), recDetails)
ctl.FileName = filename
page.EnableEventValidation = False
Dim _form As New HtmlForm()
page.Controls.Add(_form)
_form.Controls.Add(ctl)
Dim writer As New System.IO.StringWriter()
HttpContext.Current.Server.Execute(page, writer, False)
Dim output As String = writer.ToString()
writer.Close()
Return output
End Function
Вы добавляете форму динамически
setw ()
влияет только на следующую вставку. Именно так ведет себя setw ()
. Поведение setw ()
такое же, как ios_base :: width ()
. Я получил информацию о setw ()
с cplusplus.com .
Вы можете найти полный список манипуляторов здесь . По этой ссылке все флаги потока должны быть установлены, пока не будут изменены другим манипулятором. Одно замечание о левом
, правом
и внутреннем
манипуляторах: они похожи на другие флаги, и действительно сохраняются, пока не будут изменены. Однако они действуют только в том случае, если задана ширина потока, а ширина должна задаваться для каждой строки. Так, например,
cout.width(6);
cout << right << "a" << endl;
cout.width(6);
cout << "b" << endl;
cout.width(6);
cout << "c" << endl;
даст вам
> a
> b
> c
, а
cout.width(6);
cout << right << "a" << endl;
cout << "b" << endl;
cout << "c" << endl;
даст вам
> a
>b
>c
Манипуляторы ввода и вывода не являются липкими и появляются только один раз там, где они используются. Все параметризованные манипуляторы отличаются друг от друга, вот краткое описание каждого:
setiosflags
позволяет вам вручную устанавливать флаги, список которых можно найти здесь , так что он липкий.
Resetiosflags
ведет себя аналогично setiosflags
, за исключением того, что он сбрасывает указанные флаги.
setbase
устанавливает базу целых чисел, вставленных в поток (таким образом, 17 в базе 16 будет «11», а в базе 2 будет «10001»).
setfill
устанавливает символ заполнения для вставки в поток, когда используется setw
.
setprecision
устанавливает десятичную точность, которая будет использоваться при вставке значений с плавающей запятой.