При добавлении параметров WHERE-предложения в DataSource вы можете указать существующий элемент управления формой (текстовое поле, выпадающее меню и т.д.), выбрав "Source: Control", а затем выбрав "ControlID" из следующего раскрывающегося списка.
Есть ли способ настроить пользовательский элемент управления, чтобы он появился в списке элементов управления?
ИЛИ
Как я могу использовать свойство пользовательского элемента управления в качестве параметра запроса?
Я не уверен, что вы можете сделать это с помощью System.Web.UI.UserControl
, но я смог сделать это с помощью System.Web.UI.WebControls.WebControl
.
Вы должны пометить свой класс WebControl как [ControlValueProperty("PropertyName")]
.
PropertyName - это имя свойства, значение которого будет использоваться в предложении where. Например, в случае TextBox это "Текст", в случае DropDownList это "SelectedValue"
Я попытался сделать это с помощью UserControl, но не смог заставить его работать, сообщит вам, найду ли решение.
Вы можете создать настраиваемые параметры, например http://fredrik.nsquared2.com/viewpost.aspx?PostID=355
но может быть проще сделать следующее:
Мы добавляем событие выбора в источник данных, который будет извлекать общедоступное свойство из пользовательского элемента управления и устанавливать его как параметр. Открытое свойство пользовательского элемента управления извлекает значение некоторого веб-элемента управления, например текстовое поле, и предоставляет его как свойство.
Учитывая следующий SqlDataSource
<asp:sqlDataSource ID="EmployeeDetailsSqlDataSource"
SelectCommand="SELECT EmployeeID, LastName, FirstName FROM Employees WHERE EmployeeID = @EmpID"
<SelectParameters>
<asp:Parameter Name="EmpID" Type="Int32" DefaultValue="0" />
</SelectParameters>
</asp:sqlDataSource>
Мы добавляем событие выбора таким образом
protected void EmployeeDetailsSqlDataSource_Selecting(object sender, SqlDataSourceSelectingEventArgs e)
{
e.Command.Parameters["@EmpID"].Value = MyUserControl.EmpID;
}
Пользователь UserControl обладает таким свойством:
public int EmployeeID {
get {
return Convert.ToInt32(TextBox1.Text);
}
}
Где TextBox1 - это место, где пользователь вводит идентификатор employeeID. Вы также можете использовать ViewState для хранения свойства EmployeeId в случае, если вы хотите сохранить обратную передачу (в зависимости от вашего сценария).
Ваш контроль должен будет реализовать интерфейс IPostBackDataHandler, чтобы он мог "сообщать" выбранный индекс или значение серверу, когда ваша страница возвращается. Интерфейс реализован как TextBox, так и DropDownList. Я не уверен, использует ли Visual Studio diaolg его, чтобы определить, показывать ли его в списке "Элементы управления", но стоит попробовать. Я все еще изучаю, как это работает, но я думал, что опубликую это, чтобы вы поняли это.