ASP.NET не удалось найти элемент управления в ControlParamater
В этот момент я довольно растерялся (некоторое время не работал над этим и не выполняю задание / срок), но я получаю сообщение об ошибке после нажатия кнопки btnupdate для обновления полей в базе данных.
Полное сообщение об ошибке:
Could not find control 'txtTitle' in ControlParameter 'Title'.
Страница:
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<div class="floater">
<h3>Books</h3>
<asp:DropDownList
id="DropDownList_Books"
DataSourceId="srcBooks"
DataTextField="Title"
DataValueField="Id"
Runat="server" />
<asp:Button ID="btnSelect" runat="server" Text="View Detials" Width="106px"
onclick="btnSelect_Click" />
</div>
<asp:GridView
id="grdBooks"
DataSourceID="srcBooks_Description"
Runat="server" Visible="False" />
<asp:Button ID="btnEdit" runat="server" onclick="btnEdit_Click" Text="Edit" />
</div>
<asp:Button ID="btnCancel" runat="server" onclick="btnCancel_Click"
Text="Cancel" Visible="False" />
<asp:FormView
id="frmEditBook"
DataKeyNames="Cat_Id"
DataSourceId="srcBooks_Description"
DefaultMode="Edit"
Runat="server" Visible="False"
style="z-index: 1; left: 391px; top: 87px; position: absolute; height: 111px; width: 206px" >
<EditItemTemplate>
<asp:Label
id="lblTitle"
Text="Title:"
AssociatedControlID="txtTitle"
Runat="server" />
<asp:TextBox
id="txtTitle"
Text='<%#Bind("Title")%>'
Runat="server" />
<br />
<asp:Label
id="lblDescription"
Text="Description:"
AssociatedControlID="txtDescription"
Runat="server" />
<asp:TextBox
id="txtDescription"
Text='<%#Bind("Description")%>'
Runat="server" />
<br />
<asp:Button
id="btnUpdate"
Text="Update"
CommandName="Update"
Runat="server" />
</EditItemTemplate>
</asp:FormView>
<asp:SqlDataSource ID="srcBooks" runat="server"
ConnectionString="Data Source=****;;Initial Catalog=***;Persist Security Info=True;User ID=****;Password=****"
onselecting="srcBooks_Selecting" ProviderName="System.Data.SqlClient" SelectCommand="SELECT Title,Id FROM PARTIN_ID">
</asp:SqlDataSource>
<asp:SqlDataSource ID="srcBooks_Description" runat="server"
ConnectionString="Data Source=****, 14330";Initial Catalog=****;Persist Security Info=True;User ID=****;Password=****"
onselecting="srcBooks_Selecting" ProviderName="System.Data.SqlClient" SelectCommand="SELECT * FROM PARTIN_INFO WHERE Cat_ID=@Id" UpdateCommand="UPDATE PARTIN_INFO SET Title=@Title,
Description=@Description WHERE Cat_Id=@Id">
<SelectParameters>
<asp:ControlParameter
Name="Id"
Type="int32"
ControlID="DropDownList_Books"
PropertyName="SelectedValue" />
</SelectParameters>
<UpdateParameters>
<asp:ControlParameter Name="Title" ControlId="txtTitle" PropertyName="Text"/>
<asp:ControlParameter Name="Description" ControlId="txtDescription" PropertyName="Text"/>
<asp:ControlParameter Name="Id" ControlId="DropDownList_Books" PropertyName="SelectedValue"/>
</UpdateParameters>
</asp:SqlDataSource>
</form>
</body>
</html>
Код позади:
namespace WebApplication1
{
public partial class WebForm1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void srcBooks_Selecting(object sender, SqlDataSourceSelectingEventArgs e)
{
}
protected void btnSelect_Click(object sender, EventArgs e)
{
grdBooks.Visible = true;
}
protected void btnCancel_Click(object sender, EventArgs e)
{
frmEditBook.Visible = false;
}
protected void btnEdit_Click(object sender, EventArgs e)
{
frmEditBook.Visible = true;
btnCancel.Visible = true;
}
protected void btnUpdate_Click(object sender, EventArgs e)
{
try
{
srcBooks_Description.Update();
}
catch (Exception except)
{
// Handle the Exception.
}
}
}
}
5 ответов
Вы можете обратиться к контролю адекватно.
Вам необходимо добавить к значению controlid значение ваших параметров обновления с помощью идентификатора элемента управления вашего вложенного представления (в данном случае FormView 'frmEditBook')
Замените раздел UpdateParamters вашего SqlDataSource следующим:
<UpdateParameters>
<asp:ControlParameter Name="Title" ControlId="frmEditBook$txtTitle" PropertyName="Text"/>
<asp:ControlParameter Name="Description" ControlId="frmEditBook$txtDescription" PropertyName="Text"/>
<asp:ControlParameter Name="Id" ControlId="DropDownList_Books" PropertyName="SelectedValue"/>
</UpdateParameters>
Обратите внимание, что
ControlId="DropDownList_Books"
остается тем же самым, поскольку этот элемент управления не находится в пределах FormView.
Я не рекомендую использовать "полное имя", предоставленное браузером... особенно если вы используете главные страницы... оно может измениться, когда вы переставите макеты.
Как видите, проблема в контексте. Вы также можете поместить свой sqldatasource в форму просмотра, где находится элемент управления, на который ссылаются (не правильно и очень ограниченно, но может работать)
Допустим, у вас есть подробное представление с двумя выпадающими списками, и один зависит от другого. Что работает для меня, так это поместить источник данных в тот же контекст (родительский элемент управления), на который ссылается элемент управления, и это избавит от необходимости ссылаться на полный путь элемента управления.
Мои два цента в том, что это очень напоминает то, как вы должны ссылаться на элементы управления в формах доступа с подчиненными формами.:)
<asp:DetailsView runat="server">
<asp:TemplateField>
<EditTemplate>
<asp:DropDownList id="ParentDDL" Datasource="SQLDataSource1">
</asp:DropDownList>
</EditTemplate>
</asp:TemplateField>
<asp:TemplateField>
<EditTemplate>
<asp:DropDownList id="ParentDDL" Datasource="SQLDatasource2">
</asp:DropDownList>
<asp:SqlDataSource ID="SqlDataSource2" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionString %>" SelectCommand="SELECT * from table where field1=@field">
<SelectParameters>
<asp:ControlParameter ControlID="ParentDDL" Name="field"
PropertyName="SelectedValue" Type="String" />
</SelectParameters>
</asp:SqlDataSource>
</EditTemplate>
</asp:TemplateField>
</asp:DetailsView>
Вы должны обратиться к своему контролю с его полным именем.
Вы можете легко найти полное имя элемента управления, открыв страницу в браузере. Просто просмотрите источник, и вы увидите его.
Ты не должен был использовать <asp:ControlParameter..
но <asp:Parameter..
и элемент управления SqlDataSource с помощью метода привязки достаточно умен, чтобы найти элементы управления, чтобы получить значения для параметров.
Обновите эту часть sqlDataSource следующим образом:
....
<UpdateParameters>
<asp:Parameter Name="Title" Type="String"/>
<asp:Parameter Name="Description" Type="String"/>
<asp:Parameter Name="Id" Type="Int32"/>
</UpdateParameters>
.....
Обратите внимание на атрибут Type и укажите соответствующий тип.
(Проблема в том, что элемент управления SqlDataSource не может явно получить доступ к элементам управления, определенным в элементе управления с привязкой к данным)
Проблема в том, что txtTitle
находится внутри FormView, поэтому он недоступен, как вы пытаетесь сделать с SqlDataSource. Вы не можете получить к нему доступ по ID.
Здесь у вас есть статья MSDN, которая может помочь в работе с FormView и SqlDataSource