Использование глобального макета слушателя всегда хорошо работало для меня. Преимущество состоит в том, что он может перезаписывать вещи при изменении макета, например, если что-то установлено на View.GONE или дочерние представления добавляются / удаляются.
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
// inflate your main layout here (use RelativeLayout or whatever your root ViewGroup type is
LinearLayout mainLayout = (LinearLayout ) this.getLayoutInflater().inflate(R.layout.main, null);
// set a global layout listener which will be called when the layout pass is completed and the view is drawn
mainLayout.getViewTreeObserver().addOnGlobalLayoutListener(
new ViewTreeObserver.OnGlobalLayoutListener() {
public void onGlobalLayout() {
//Remove the listener before proceeding
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
mainLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this);
} else {
mainLayout.getViewTreeObserver().removeGlobalOnLayoutListener(this);
}
// measure your views here
}
}
);
setContentView(mainLayout);
}
Ну, я исправил эту проблему. Я перешел на использование следующего метода для вызова doPostBack.
http://encosia.com/2007/07/13/easily-refresh-an-updatepanel-using-javascript/
Надеюсь, это поможет.
Проверьте это http://www.4guysfromrolla.com/articles/012506-1.aspx
Короче говоря, (1) существует свойство «SubmitDisabledControls» формы или (2) откорректировать предоставленный автором javascript
-121--3603998-Я сдался в конце концов и подключился к библиотеке проверки JQuery, а не с помощью Microsoft ASP.NET MVC 2 RC и файла библиотеки
В этой статье описывается процесс: http://haacked.com/archive/2009/11/19/aspnetmvc2-custom-validation.aspx
Таким образом, с проверкой JQuery в действительности все, что мне нужно было сделать, это сделать вызов valid ()...
$('form').submit(function() {
if ($('form').valid()) {
$('input[type=submit]', this).attr('disabled', 'disabled');
ShowBusy();
}
});
-121--3950606- Я вижу, вы ответили на свой собственный вопрос, но для других, вместо doPostBack (), почему бы не установить оба таймера для обновления через указанный интервал или как метод события Tick с «UpdatePanel1.Update ()» в конце метода? Для этого пути необходимо задать интервал в самом коде страницы Default.aspx; Я выбрал 10 мс, чтобы он мог показать прогресс для очень быстрой операции:
<asp:ScriptManager ID="ScriptManager1" runat="server" AsyncPostBackTimeout="360000" />
<asp:Button ID="btnDoSomething" runat="server" Text="Do Something" OnClick="btnDoSomething_Click" />
<asp:UpdatePanel ID="UpdatePanel1" runat="server" OnLoad="UpdatePanel1_Load" UpdateMode="conditional">
<ContentTemplate>
<span id="spnLabel" runat="server">
<asp:Timer ID="Timer1" runat="server" Interval="10" OnTick="Timer1_Tick"></asp:Timer>
</ContentTemplate>
<Triggers >
<asp:AsyncPostBackTrigger ControlID="Timer1" EventName="Tick" />
</Triggers>
</asp:UpdatePanel>
Тогда у вас есть метод Timer1_Tick в коде позади, который вы вызываете при обновлении - в этом примере что-то добавить в spnLabel.IniveHtml из метода btnDoSomething_Click ():
protected void btnDoSomething_Click(object sender, EventArgs e)
{
Timer1.Enabled = true;
Timer1.Interval = 10;
Timer1_Tick(sender, e);
Timer1.Enabled = false;
}
protected void Timer1_Tick(object sender, EventArgs e)
{
spnLabel.InnerHtml = "hi";
UpdatePanel1.Update();
}
Помните, что обновлением управляет интервал таймера, а не когда вы вызываете Timer1_Tick (отправитель, e), даже если у вас есть UpdatePanel1.Update () в конце - например, если вы устанавливаете интервал 10000, он будет обновляться через 10 секунд, даже если ваша операция использовала метод Timer1_Tick () несколько раз до этого. Вам все равно понадобится UpdatePanel1.Update () в конце, независимо, хотя.
-Том