我有2个网格视图。 Gridview1
,Gridview2
。
两者都有一个共同字段“ID”
当我选择Gridview1
(ID=1
)中的第一行时,ID=1
中Gridview2
的值显示在嵌套区域中,但值显示在每一行中Gridview1。当我删除“选择”时,Gridview2
没有显示任何内容。
当我打开页面时,我希望Gridview1
显示,然后嵌套Gridview2
显示来自Gridivew1
的个人ID的内容。我不想让select看到所有内容,我只想让两个表都显示他们的数据。
我做了什么:
Gridview1
Gridview2
)Gridview2
Gridview1
的控制值ID
(Gridview1.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();
}
}
}
答案 0 :(得分:0)
您的问题是您正在为多个GridView使用一个SqlDataSource。由于每个GridView2都使用SqlDataSource2,它们最终都会得到相同的数据 - 最后一个GridView2绑定的数据。 SqlDataSources在标记中设置时会自动绑定,如下所示:DataSourceID="SqlDataSource2"
。
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的谨慎。