ASP.NET用户控件作为FilterParameter

时间:2010-04-12 15:26:36

标签: c# asp.net vb.net user-controls

在DataSource中添加WHERE子句参数时,您可以通过选择“Source:Control”然后从下一个下拉列表中选择“ControlID”来指定现有的表单控件(文本框,下拉列表等)。

是否有某种方法可以配置用户控件,使其显示在“控件”列表中?

OR

如何将用户控件的属性用作查询参数?

3 个答案:

答案 0 :(得分:2)

我不确定您是否可以使用System.Web.UI.UserControl执行此操作,但我可以使用System.Web.UI.WebControls.WebControl执行此操作。

您必须将WebControl类标记为[ControlValueProperty("PropertyName")]

PropertyName 是将在where子句中使用其值的属性的名称。例如,在TextBox的情况下,它是“Text”,在DropDownList的情况下,它是“SelectedValue”

我尝试使用UserControl执行此操作但无法使其正常工作,如果找到解决方案,会通知您。

答案 1 :(得分:0)

您的控件需要实现IPostBackDataHandler接口,以便在您的页面回发时它可以将所选索引或值“报告”到服务器。该接口由TextBox和DropDownList实现。我不确定Visual Studio diaolg是否使用它来确定是否在Controls列表中显示它,但值得一试。我仍然在研究它是如何工作的,但我想我会发布这个来让你研究它。

答案 2 :(得分:0)

您可以像这样创建自定义参数 http://fredrik.nsquared2.com/viewpost.aspx?PostID=355

但可能更容易做到以下几点:

我们向数据源添加一个选择事件,该事件将从用户控件检索公共属性并将其设置为参数。用户控件的公共属性检索某些Web控件的值,如文本框,并将其作为属性公开。

给出以下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属性,以防您希望在回发期间保持不变(取决于您的方案)。