These are UserControls, correct? I think the best way to communicate among UserControls is to use events. Create your own EventArgs class to encapsulate the search criteria. The submission control raises an event when a search is submitted, and the containing page handles the event and calls a method on the search results control to perform the search and display results.
Alternately, the results control could just be responsible for displaying a collection of objects and the search control would actually execute the search and return the collection in the EventArgs.
Here's an example from a master-detail set of UserControls. The ProjectList UserControl raises an event when a project is selected:
public event EventHandler<ProjectSelectedEventArgs> ProjectSelected;
protected void uxProjectList_OnSelectedIndexChanged(object sender, EventArgs e)
{
if (ProjectSelected != null)
{
var keys = uxProjectList.DataKeys[uxProjectList.SelectedIndex].Values;
var projectId = (Guid)keys[0];
var args = new ProjectSelectedEventArgs(projectId);
ProjectSelected(this, args);
}
}
The container page handles the event and calls a method on the ProjectDetail UserControl to display details for the project.
protected void uxHeroProjectList_ProjectSelected(object sender, ProjectSelectedEventArgs e)
{
uxProjectDetails.Visible = true;
uxProjectDetails.DisplayDetails(e.ProjectId);
}