如何将网格视图绑定到用户控件的结果
本文关键字:用户 控件 结果 绑定 网格 视图 | 更新日期: 2023-09-27 18:34:54
我的 aspx 页包含一个用户控件和一个 GridView。单击用户控件中的按钮时,将创建一个数据表,我需要将 aspx 页中的 GridView 数据源设置为该数据表。
我阅读了"RaiseBubbleEvent"方法,将单击按钮的事件传递给父页面,但我不需要只传递事件,我还需要传递创建的DataTable。
这是我的用户控件:
<table>
<tr>
<td style="width: 10%">
<asp:Label ID="lblSearch" runat="server" Text="Search" Width="50px" Font-Size="Medium"></asp:Label>
</td>
<td style="width: 10%">
<asp:DropDownList CssClass="myddl" ID="DDLSearch" runat="server" Width="100px" OnSelectedIndexChanged="DDLRefugeeSearch_SelectedIndexChanged">
</asp:DropDownList>
</td>
<td style="width: 10%">
<asp:TextBox CssClass="mytextbox" ID="txtSearch" runat="server"></asp:TextBox>
</td>
<td style="width: 10%">
<asp:Button ID="BtnGo" runat="server" Text="Go" OnClick="getSearchResults" />
</td>
</tr>
</table>
这是"getSearchResult"事件的隐藏代码:
protected DataTable getSearchResults(object sender, EventArgs e)
{
string FieldName=DDLSearch.SelectedValue;
string SearchText=txtSearch.Text.Replace(" ","");
RaiseBubbleEvent(this, e);
return _BLTablesSearch.getSearchResults(FieldName, SearchText);
}
这是我页面中的用户控件:
<td>
<uc1:QuickSearchControl runat="server" id="QuickSearchControl" />
</td>
所以我的问题是如何执行以下操作:
1-单击用户控件的"转到"按钮时,在父页
中引发事件2-在用户控件
中执行所需的操作3-将数据表返回到父页面
4-将网格视图绑定到该数据表
编辑:
我按照 @Lior Raz 的答案更新了我的代码
如下这是用户控件代码:
public string TableName;
BLTablesSearch _BLTablesSearch = new BLTablesSearch();
public delegate void SearchComplete(DataTable FilteredData);
public event SearchComplete OnSearchComplete;
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
DDLSearch.DataSource = _BLTablesSearch.getSearchFields(TableName);
DDLSearch.DataTextField = "FieldText";
DDLSearch.DataValueField = "FieldValue";
DDLSearch.DataBind();
}
}
protected void getSearchResults(object sender, EventArgs e)
{
string FieldName=DDLSearch.SelectedValue;
string SearchText=txtSearch.Text.Replace(" ","");
}
这是 aspx 页代码:
BLPerson BLPerson = new BLPerson();
BLREOptions BLREOptions = new BLREOptions();
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
PersonListGridView.DataSource = BLPerson.getAllPersons();
PersonListGridView.DataBind();
QuickSearchControl.TableName = "Person";
}
QuickSearchControl.OnSearchComplete += new UserControls.QuickSearchControl.SearchComplete(HandleOnSearchComplete);
}
public void HandleOnSearchComplete(DataTable _searchResult)
{
}
不使用
RaiseBubbleEvent 我认为这是一个糟糕的设计选择,因为当您有许多使用此冒泡方法的子控件时,它可能会导致代码混乱,而是使用委派和事件来控制程序的流程。
在用户控件中,在类声明中添加以下行:
public delegate void SearchComplete(DataTable FilteredData);
public event SearchComplete OnSearchComplete;
此外,还有一个保存原始数据表的属性(因此,当您清除搜索时,您可以显示未筛选的结果(
用户控制代码:
public DataTable AllRecords { get { return Session["AllRecords"]; } set { Session["AllRecords"] = value;} }
public string TableName;
BLTablesSearch _BLTablesSearch = new BLTablesSearch();
public delegate void SearchComplete(DataTable FilteredData);
public event SearchComplete OnSearchComplete;
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
DDLSearch.DataSource = _BLTablesSearch.getSearchFields(TableName);
DDLSearch.DataTextField = "FieldText";
DDLSearch.DataValueField = "FieldValue";
DDLSearch.DataBind();
}
}
protected void getSearchResults(object sender, EventArgs e)
{
string FieldName=DDLSearch.SelectedValue;
string SearchText=txtSearch.Text.Replace(" ","");
// TODO: filter the AllRecords Table according to what ever you want
DataTable filteredRecords = YourFilteringFunction(FieldName,SearchText);
if(OnSearchComplete != null)
OnSearchComplete(filteredRecords);
}
在 ASPX 页上,只需将数据表分配给用户控件属性(保存数据表(并注册到用户控件的事件。
在注册函数中,将网格的数据源分配给筛选数据,并调用网格的绑定函数。
ASPX 代码:
BLPerson BLPerson = new BLPerson();
BLREOptions BLREOptions = new BLREOptions();
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
DataTable allPersons = BLPerson.getAllPersons();
QuickSearchControl.AllRecords = allPersons;
PersonListGridView.DataSource = allPersons;
PersonListGridView.DataBind();
QuickSearchControl.TableName = "Person";
}
QuickSearchControl.OnSearchComplete += new UserControls.QuickSearchControl.SearchComplete(HandleOnSearchComplete);
}
public void HandleOnSearchComplete(DataTable _searchResult)
{
PersonListGridView.DataSource = _searchResult;
PersonListGridView.DataBind();
}