访问网格视图标头中的文本框值

本文关键字:文本 网格 视图 图标 访问 | 更新日期: 2023-09-27 18:34:16

我有一个包含库存数据的网格视图。我正在尝试将一个搜索函数放在一起,该函数将根据网格视图标头中每个控件的内容动态创建 SQL WHERE 子句。

网格视图中的每一列都是一个模板字段,控件添加在标题模板中。

这是我的代码。每当它运行时,控件(在本例中为 chkCaseSearch)为空,并且我收到"对象引用未设置为对象的实例"错误。

这是我的 C# 代码;它位于按钮单击事件中(按钮也是 gridview 标头中的一个控件)。每个控件都有一个等效的 if 语句,但为了简洁起见,我只显示一个。

谢谢!

TextBox tbManufacturerSearch = gvFirearms.FindControl("txtManufacturerSearch") as TextBox;
TextBox tbModelSearch = gvFirearms.FindControl("txtModelSearch") as TextBox;
TextBox tbSerialSearch = gvFirearms.FindControl("txtSerialSearch") as TextBox;
TextBox tbCaliberSearch = gvFirearms.FindControl("txtCaliberSearch") as TextBox;
DropDownList ddlTypeSearch = gvFirearms.FindControl("ddlTypeSearch") as DropDownList;
DropDownList ddlFormSearch = gvFirearms.FindControl("ddlFormSearch") as DropDownList;
CheckBox chkCaseSearch = gvFirearms.FindControl("chkCaseSearch") as CheckBox;
TextBox tbMagazineSearch = gvFirearms.FindControl("txtMagazineSearch") as TextBox;
TextBox tbLocationSearch = gvFirearms.FindControl("txtLocationSearch") as TextBox;
TextBox tbCommentsSearch = gvFirearms.FindControl("txtCommentsSearch") as TextBox;
if (chkCaseSearch.Checked)
{
    strWhereClause = "[Case] = 1";
}
else if (!chkCaseSearch.Checked)
{
    strWhereClause = "[Case] = 0";
}

访问网格视图标头中的文本框值

看起来你必须像这样通过HeaderRow访问它

CheckBox chkCaseSearch = gvFirearms.HeaderRow.FindControl("chkCaseSearch") as CheckBox;

如果在 Web 环境中,是否在 aspx 页中指定了 ID 标记?如果您使用的是 Winform 应用程序,则(例如)this.txtMagazineSearch调用即可访问控件属性。

GridView 控件是数据集的呈现工具,因此你可以

  • 动态重新生成数据集,并将其重新绑定到 GridView(如果要筛选信息)
  • 遍历显示的项目,以证明与标准匹配的项目

在第一种情况下,我认为更相关,您可以在"刷新"按钮OnClickEvent中使用如下所示的内容:

protected void cmdRefresh_Click(object sender, EventArgs e)
{
        SqlConnection conn = new SqlConnection(connectionManager.getConnectionString("myDB"));
        SqlCommand cmd = new SqlCommand("myQry", conn);
        cmd.CommandType = System.Data.CommandType.StoredProcedure;
        SqlDataReader rdr;
        cmd.Parameters.Add(new SqlParameter("@Par1", chkCaseSearch.Checked));
        try
        {
            conn.Open();
            rdr = cmd.ExecuteReader();
        }
        catch (Exception)
        {
            throw;
        }
        grdView1.DataSource = rdr;
        grdView1.DataBind();
}

可以将存储过程定义替换为包含要启动的 SQL 命令的文本。

希望这有帮助。

保罗

我需要特别告诉网格视图我正在寻找的控件在标题行中。

TextBox tbManufacturerSearch = gvFirearms.HeaderRow.FindControl("txtManufacturerSearch") as TextBox;

即使 gridview 的每次迭代只有一个具有该名称的控件,仍然需要告知它具体在哪一行中。

谢谢!