嵌套Gridview冗余值

时间:2015-01-22 18:24:07

标签: c# asp.net gridview

我有2个网格视图。 Gridview1Gridview2。 两者都有一个共同字段“ID” 当我选择Gridview1ID=1)中的第一行时,ID=1Gridview2的值显示在嵌套区域中,但值显示在每一行中Gridview1。当我删除“选择”时,Gridview2没有显示任何内容。 当我打开页面时,我希望Gridview1显示,然后嵌套Gridview2显示来自Gridivew1的个人ID的内容。我不想让select看到所有内容,我只想让两个表都显示他们的数据。

我做了什么:

  • 添加Gridview1
  • 选择我的列以使用sql数据源显示
  • 编辑列(添加了一些边界字段和模板字段以表示Gridview2
  • 编辑模板
  • 在模板中插入Gridview2
  • 选择我的专栏
  • 其中ID = Gridview1的控制值IDGridview1.SelectedValue
  • Gridview1的{​​{1}}设置为DataKeyNames

代码背后:

ID

HTML标记:

public partial class _Webform : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            GridView gv2 = (GridView)e.Row.FindControl("GridView2");

            string connString = @"Data Source=SRV\\\SQLEXPRESS;Initial Catalog=Test_Database;Integrated Security=True";
            string query = "select * from dbo.task where PO_ID =" + e.Row.Cells[0].Text;

            SqlConnection conn = new SqlConnection(connString);
            SqlCommand cmd = new SqlCommand(query, conn);
            conn.Open();

            SqlDataAdapter da = new SqlDataAdapter(cmd);
            DataTable dt = new DataTable();
            da.Fill(dt);
            conn.Close();
            da.Dispose();

            gv2.DataSource = dt;
            gv2.DataBind();
        }
    }
}

1 个答案:

答案 0 :(得分:0)

您的问题是您正在为多个GridView使用一个SqlDataSource。由于每个GridView2都使用SqlDataSource2,它们最终都会得到相同的数据 - 最后一个GridView2绑定的数据。 SqlDataSources在标记中设置时会自动绑定,如下所示:DataSourceID="SqlDataSource2"

MSDN on SqlDataSources:

  

Select方法由调用其DataBind方法时绑定到SqlDataSource的控件自动调用。如果设置数据绑定控件的DataSourceID属性,则控件会根据需要自动绑定到数据源中的数据。

这意味着当您在GridView1_RowDataBound中更改SqlDataSource2的where子句时,所有GridView2都将与该新过滤器绑定。

要解决此问题,请不要为GridView2使用SqlDataSource。相反,使用他们自己的数据集单独绑定它们。

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        GridView gv2 = (GridView)e.Row.FindControl("GridView2");

        string connString = @"your connection string here";
        string query = "select * from dbo.task where PO_ID = " + e.Row.Cells[0].Text;

        SqlConnection conn = new SqlConnection(connString);        
        SqlCommand cmd = new SqlCommand(query, conn);
        conn.Open();

        SqlDataAdapter da = new SqlDataAdapter(cmd);
        DataTable dt = new DataTable();
        da.Fill(dt);
        conn.Close();
        da.Dispose();

        gv2.DataSource = dt;
        gv2.DataBind();
    }
}

同样,我需要在这样做的时候强调SQL Injection的谨慎。

相关问题