<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=336202&amp;view=findpost&amp;p=2936562</guid>
        <pubDate>Fri, 15 Jul 2011 10:52:36 +0000</pubDate>
        <title>Неправильные значения свойства Top у UserControl.</title>
        <link>https://forum.sources.ru/index.php?showtopic=336202&amp;view=findpost&amp;p=2936562</link>
        <description><![CDATA[Felan: Странно, но как оказалось, что после скроллинга, значения топов считаются непонятно от чего. :(<br>
<br>
В общем, так все работает как надо:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">pnlQuestions.AutoScrollPosition = new Point(0, Math.Abs(pnlQuestions.AutoScrollPosition.Y) + y);</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script>]]></description>
        <author>Felan</author>
        <category>.NET: Compact Framework</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=336202&amp;view=findpost&amp;p=2935647</guid>
        <pubDate>Thu, 14 Jul 2011 12:04:37 +0000</pubDate>
        <title>Неправильные значения свойства Top у UserControl.</title>
        <link>https://forum.sources.ru/index.php?showtopic=336202&amp;view=findpost&amp;p=2935647</link>
        <description><![CDATA[Felan: Есть форма. На этой форме находится панель (pnl1). На этой панели лежит UserControl список, у которого есть ряд панелей. Одна из панелей (pnl2) содержит кучу userControl&#39;ов (Qx, где x &gt; 30), и должна эту кучу скроллировать. У нее стоят свойства AutoScroll и ScrollMargin.<br>
<br>
Все контролы Q, наследники от одного базового UserControl:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp; &nbsp;public partial class BaseQuestionCtrl : UserControl</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;public BaseQuestionCtrl()</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;InitializeComponent();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;public virtual string MessageText { get; set; }</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;public virtual int Order { get; protected set; }</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;public virtual string Topic{ get; set; }</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;public virtual bool ShowTopic { get; set; }</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;public virtual bool ShowOrder { get; set; }</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;public virtual bool TestFilter(QuestionFilter filter)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return true;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;public virtual bool SaveChanges()</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return false;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;public event EventHandler&#60;CallbackCommandEventArgs&#62; CallbackCommand;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;protected void DoCallbackCommandEvent(CallbackCommand command)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (CallbackCommand != null)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;CallbackCommand(this, new CallbackCommandEventArgs(command));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div></ol></div></div></div></div><br>
<br>
Суть в том, что при выполнение некоторых действий с каждым контролом должно вызываться определенное действите, в частности панель 2 должна прокрутиться к следующему контролу. Это делается при помощи события и нужной команды.<br>
<br>
Типа так:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp; &nbsp;public partial class QuestionCtrlComboBox : BaseQuestionCtrl</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;***</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;private void TxbCorrectiveActionGotFocus(object sender, EventArgs e)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;DoCallbackCommandEvent(TaskChecklistReport.CallbackCommand.ShowKeyboard);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;private void TxbCorrectiveActionLostFocus(object sender, EventArgs e)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;DoCallbackCommandEvent(TaskChecklistReport.CallbackCommand.HideKeyboard);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;private void BtnOkClick(object sender, EventArgs e)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;DoCallbackCommandEvent(TaskChecklistReport.CallbackCommand.HideKeyboard);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;DoCallbackCommandEvent(TaskChecklistReport.CallbackCommand.GoToNextQuestion);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div></ol></div></div></div></div><br>
<br>
На форме обработчик выглядит так:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;private void OnCallbackCommand(object sender, CallbackCommandEventArgs callbackCommandEventArgs)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;var ctrl = (BaseQuestionCtrl)sender;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;switch (callbackCommandEventArgs.Command)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;case CallbackCommand.ShowKeyboard:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;qlcQuestions.ScrollTo(ctrl);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;inputPanel.Enabled = true;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;break;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;case CallbackCommand.HideKeyboard:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;inputPanel.Enabled = false;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;break;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;case CallbackCommand.GoToNextQuestion:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;var nextCtrl = qlcQuestions.GetNextCtrl(ctrl);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (nextCtrl != null) qlcQuestions.ScrollTo(nextCtrl);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;break;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;default:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;throw new ArgumentOutOfRangeException();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div></ol></div></div></div></div><br>
<br>
Т.е. для команды скроллинга ищется нужный контрол, и передается в метод ScrollTo контролу списку, который содержит панель, которая должна скроллироваться.<br>
Нужный котрол ищется правильно.<br>
<br>
Метод ScrollTo выглядит так:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;public void ScrollTo(BaseQuestionCtrl ctrl)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;pnlQuestions.AutoScrollPosition = new Point(0, ctrl.Top);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div></ol></div></div></div></div><br>
Т.е. просто панели устанавливается нужная позиция.<br>
<br>
Контролы в панель добавляются так:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;foreach (var questionCtrl in _filteredQuestionCtrls)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;pnlQuestions.Controls.Add(questionCtrl);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;questionCtrl.ShowOrder = ShowOrderInQuestions;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;questionCtrl.ShowTopic = questionCtrl.Topic != topic;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;topic = questionCtrl.Topic;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;questionCtrl.BringToFront();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div></ol></div></div></div></div><br>
Где _filteredQuestionCtrls просто список всех отображаемых на панели контролов. У этих контролов стоит Dock = Top. Визуально они в правильном порядки и если мышкой тянуть скролл или нажимать на кнопки скролла, то все работает нормально.<br>
<br>
Если же при выполнении кода срабатывает событие CallbackCommand то в методе ScrollTo у контрола свойство Top имеет не правильное значение. Ну т.е. оно то может и правильное, но не такое как мне надо.<br>
<br>
В чем может быть проблема???<br>
<br>
Самое интересное, что когда скроллинг был на панели формы (pnl1), а контрол списка изменял свои размеры так, что бы вместить все вопросы, то программный скроллинг работал нормально. Но понадобилось перенести его в панель которая находится в контроле списка (pnl2).<br>
<br>
Уже не знаю даже чего придумать. :(]]></description>
        <author>Felan</author>
        <category>.NET: Compact Framework</category>
      </item>
	
      </channel>
      </rss>
	