2009-11-21 3 views
0

Привет Допустимо ли переопределять метод «Рендеринг» при создании пользовательской веб-части в SharePoint? У меня есть веб-часть, которая наследуется от System.Web.UI.WebControls.WebPart. Я добавляю элементы управления в коллекцию элементов управления в «CreateChildControls», а затем переопределяет метод «Render» для рендеринга html и элементов управления.SharePoint WebPart + переопределить метод визуализации

У меня возникли некоторые проблемы, когда я использую раскрывающийся список, но хочу знать, правильный ли мой подход или нет, прежде чем я попытаюсь исправить проблему, связав выпадающий список.

Edited

Я инициализировать мои раскрывающиеся списки и добавить его в коллекцию элементов управления в «CreateChildControls». В конце этого метода я называю «BindData», который связывает мой раскрывающийся список, и если я редактирую существующую запись, он связывает данные выпадающего списка и устанавливает правильный выбранный индекс. Затем я обрабатываю элементы управления в методе «Рендеринг». Вот фрагмент кода

protected override void CreateChildControls() 
     { 
      base.CreateChildControls(); 
      this.EnsureUpdatePanelFixups(); 

ddlClient = new DropDownList(); 
      ddlClient.ID = "ddlClient"; 
      ddlClient.SelectedIndexChanged += new EventHandler(ddlClient_SelectedIndexChanged); 
      ddlClient.AutoPostBack = true; 
      ddlClient.ValidationGroup = __VALIDATIONGROUP; 
      ddlClient.Width = ObjCtrlWidth; 

      upClient = new UpdatePanel(); 
      upClient.ID = "upClient"; 
      upClient.UpdateMode = UpdatePanelUpdateMode.Conditional; 
      upClient.ContentTemplateContainer.Controls.Add(ddlClient); 

      this.Controls.Add(upClient); 

//More controls here 

BindData(); 
} 

«ddlClient является„DropDownList“,„upClient“является обновление панели. Да, у меня есть одна панель обновления для одного выпадающего списка, и я обновить другие обновления панелей с использованием метода обновления .

Это метод «Рендер»

protected override void Render(System.Web.UI.HtmlTextWriter writer) 
     { 
//stuff here 

    writer.RenderBeginTag(System.Web.UI.HtmlTextWriterTag.Td); 
      upClient.RenderControl(writer); 
      writer.RenderEndTag(); 

//stuff here 
} 

Мой метод «BindData» вызывает другие методы связывания, которые связывают различные раскрывающиеся списки и это, как один из них переплетена

private void BindData() 
      { 
       BindClientTypes(); 
       //binding other drop down lists here 

//If an existing record isbeing edited, this method will get the data from db and bind all the controls    
BindMEA(); 
      } 

private void BindClientTypes() 
     { 
      DataTable dt = DB.GetAllClientTypes(); 

      if (dt == null) 
      { 
       ltGlobalErrorMsg.Text = GlobalErrorMessage; 
       ltGlobalErrorMsg.Visible = true; 
      } 
      else 
      { 
       ddlClient.ClearSelection(); 
       ddlClient.DataSource = dt; 
       ddlClient.DataValueField = "ID"; 
       ddlClient.DataTextField = "Name"; 
       ddlClient.DataBind(); 
       ddlClient.Items.Insert(0, PleaseSelectItem); 
       ddlClient.ClearSelection(); 
      } 
     } 

В моей BindMEA, я следующий

ddlClient.ClearSelection(); 
ddlClient.Items.FindByValue(objMea.ClientTypeID.ToString()).Selected = true; 

я получаю ошибку, которая говорит, что управление не может быть два выбранных индексов. Но есть только один в любой момент времени. Состояние сбрасываемых изменений меняется, но когда дело доходит до рендера, он взрывается.

Я не могу понять, почему

Спасибо.

+0

Что произойдет, если вы не сделать .selected = верно. Какой элемент затем выбирается? –

+0

Вы очищаете правильный выбор. Мое следующее предположение могло бы быть, используете ли вы элемент PleaseSelectItem в нескольких раскрывающихся списках, что означает один и тот же экземпляр? Читать комментарии - http: // geekswithblogs.net/ranganh/archive/2006/05/03/77072.aspx –

+0

Да, я не понимал, что использую его в разных местах. – iJK

ответ

1

RenderMethod в порядке.

Это лучшее решение для вас. Линия 2 и 3 являются важными составляющими:

ddlClient.Clear(); 
ddlClient.AppendDataBoundItems = true; 
ddlClient.Add(new ListItem("Please Select"); // Important to have a new instance 
ddlClient.DataSource = dt; 
ddlClient.DataValueField = "ID"; 
ddlClient.DataTextField = "Name"; 
ddlClient.DataBind(); 
ddlClient.ClearSelection(); 
+0

Если я наследую «System.Web.UI.WebControls.WebPart», тогда мне нужно переопределить метод «Render». Поэтому я предполагаю, что я делаю правильно. – iJK

0

Так я понял, почему ошибка происходит после 6+ часов ...

Если я закомментировать эту строку в моем методе, где я связать выпадающий список

//ddlClient.Items.Insert(0, PleaseSelectItem); 

Затем я могу связать сетку и установить выбранный индекс.

Так мой метод Bind выглядит следующим образом

private void BindClientTypes() 
     { 
      DataTable dt = DB.GetAllClientTypes(); 

      if (dt == null) 
      { 
       ltGlobalErrorMsg.Text = GlobalErrorMessage; 
       ltGlobalErrorMsg.Visible = true; 
      } 
      else 
      { 
       ddlClient.DataSource = dt; 
       ddlClient.DataValueField = "ID"; 
       ddlClient.DataTextField = "Name"; 
       ddlClient.DataBind(); 
       //ddlClient.Items.Insert(0, PleaseSelectItem); 
      } 
     } 
+0

Проверьте мой пересмотренный ответ. –

Смежные вопросы