2013-12-12 4 views
0

Я создаю страницу DNN с формой. Sqldatasource находится вне формы. Мне нужно управлять вызовом sqldatasource.insert() из кода. (есть 2 кнопки - 1, которые вставляются и переходят на одну страницу, 1, которая вставляет и изменяет вид формы в режим редактирования, чтобы добавить дополнительные данные).asp.net VB Findcontrol не может найти элемент управления вне formview

Код не может найти элемент управления вне формы. Я вставлю код позади и только sqldatasource переднего конца (форма формы очень сложная и длинная).

Я использую рекурсивное управление findcontrol. Я начинаю смотреть на уровень me.page (верхний уровень?), Но я все еще получаю нулевую ссылку на источник данных sql. (Не могу найти его) (Код работает, когда я, но регулярная команда = кнопка вставки, но мне нужно управлять перенаправлением в зависимости от того, какая кнопка нажата)

Любые идеи ???

Передняя часть источника данных SQL:

<asp:SqlDataSource ID="PromotionSqlDataSource" runat="server" 
     ConnectionString="<%$ ConnectionStrings%>" 
     InsertCommand="INSERT code is here" 
     SelectCommand="select code is here" 
     UpdateCommand="UPDATE code is here" 
     DeleteCommand="DELETE code is here"> 
     <InsertParameters> 
      lots of parameters 
     </InsertParameters> 
     <EditParameters> 
      lots of parameters 
     </EditParameters> 

     <DeleteParameters> 
     </DeleteParameters> 

</asp:SqlDataSource> 

FormView: за

<asp:FormView ID="FormView1" runat="server" AllowPaging="True" 
     DataKeyNames="Promo_ID" 
     DataSourceID="PromotionSqlDataSource" DefaultMode="Insert"> 

     Lots of form code here 
<asp:Button ID="Button6" runat="server" Text="Next" onclick="Button6_Click" /> 
    </asp:FormView> 

Код:

Protected Sub Button6_Click(sender As Object, e As System.EventArgs) 
    MessageBox("BUTTON 6 CLICK") 

    Dim PromotionSqlDataSource As SqlDataSource = TryCast(FindControlRecursive(Me.Page, "PromotionSqlDataSource"), SqlDataSource) 
    PromotionSqlDataSource.Insert() 
    FormView1.ChangeMode(FormViewMode.Edit) 
End Sub 

Public Function FindControlRecursive(root As Control, id As String) As Control 
    If root.ID = id Then 
     Return root 
    End If 

    Return root.Controls.Cast(Of Control)().[Select](Function(c) FindControlRecursive(c, id)).FirstOrDefault(Function(c) c IsNot Nothing) 
End Function 
+0

Где находится кнопка6? Не можете ли вы напрямую ссылаться на «PromotionSqlDataSource»? – Jumpei

+0

Это в форме. (Я отредактировал код выше, чтобы показать кнопку) – Joe

+0

Я не уверен, что вы имеете в виду, обратившись к sqldatasource. Если вы установите DataSourceID = «PromotionSqlDataSource» на кнопку, он все равно не работает. – Joe

ответ

0

Просто последуйте за тем, что я должен был сделать, чтобы исправить эту проблему. Это ДОЛЖНО быть ошибкой в ​​том, как MS Visual Studio компилирует код. Он должен был работать с кодом выше, но этого никогда не делал. Я сделал каждую кнопку кнопкой CommandName = "Insert". Как работает базовый код asp.net, он запускает код button_click, а затем код sqldataserver Insert.

Я создал глобальный флаг, который устанавливается с событием onClick каждой кнопки. В событии after_Inserted sqldatasource я прочитал флаг, чтобы определить, какая кнопка была нажата. У меня есть оператор if then else в событии после вставки, который перенаправляет страницы в зависимости от того, как установлен флаг.

Не элегантный, но он работает именно так, как я хочу, чтобы он работал.

0

Я думаю, что вы можете использовать PromotionSqlDataSource без использования FindControl. Попробуйте ниже.

Protected Sub Button6_Click(sender As Object, e As System.EventArgs) 
    MessageBox("BUTTON 6 CLICK") 

    'Dim PromotionSqlDataSource As SqlDataSource = TryCast(FindControlRecursive(Me.Page, "PromotionSqlDataSource"), SqlDataSource) 
    PromotionSqlDataSource.Insert() 
    FormView1.ChangeMode(FormViewMode.Edit) 
End Sub 
+0

Я попробовал это для начала. К сожалению, это тоже не так. – Joe

+0

Не работает ... как? Могу ли я получить сообщение об ошибке? – Jumpei

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