【发布时间】:2016-05-19 15:32:28
【问题描述】:
这个网页应该这样流动:
调用 populateTeamMembers(),它首先检查数据表是否没有行(表明这是第一次调用该函数),如果它查询 SQL 以查看谁是现有团队成员,则加载该数据表进入数据表 sqlTeamMembers
此函数还检查第二个数据表 newTeamMembers 中是否有任何行,如果有,则将 newTeamMembers 的内容合并到 sqlTeamMembers 中。第一次加载页面时,newTeamMembers 数据表应始终为空,因此不会执行合并。
最后,现在 sqlTeamMembers 应该包含我们需要的每个人,它将它绑定到一个 gridview 以显示在网页上。
显示后,网格视图下会出现一个下拉列表,其中包含可以添加到团队中的员工列表。如果在 ddl 上更改了所选索引,您会收到回发并调用 selectedIndexChanged()。
selectedIndexChanged() 中的逻辑是将选定的个人信息查询到数据表中,如果他们已经分配到不同的团队,则会警告用户,然后继续将员工添加到 newTeamMembers 数据表中。
最后再次调用populateTeamMembers(),此时newTeamMembers数据表中有数据,进行合并,再次绑定到gridView。
由于两个数据表 sqlTeamMembers 和 newTeamMembers 的性质,我已经在我的类的头部初始化了它们,所以它们应该可以被所有函数访问。
到目前为止,它可以向 sqlTeamMembers 添加一个新行,但如果我尝试进行第二次添加,它会清除第一次添加。 出于某种原因,newTeamMembers 没有保留新行,它只包含 selectedIndexChanged() 创建的最新添加。
如何让 newTeamMembers 在每次调用 selectedIndexChanged() 时保留新行?
public partial class Personnel_Admin_Teams : System.Web.UI.Page
{
SqlConnection cnn = new SqlConnection(ConfigurationManager.ConnectionStrings["WebServerConnectionString"].ConnectionString);
SqlDataReader myreader = default(SqlDataReader);
SqlCommand cmd = new SqlCommand();
string sqlStr;
DataTable sqlTeamMembers = new DataTable();
DataTable newTeamMembers = new DataTable();
...
protected void populateTeamMembers(string TeamID)
{
if (sqlTeamMembers.Rows.Count == 0)
{
/*** Read Team Members with Matching TeamID from Employees Table ***/
cnn.Open();
sqlStr = "SELECT [ID], [LastName]+', '+[FirstName] AS [Name], ISNULL([TeamRole], '') AS [TeamRole] FROM [Employees] WHERE [TeamID] = " + TeamID + ";";
cmd = new SqlCommand(sqlStr, cnn);
sqlTeamMembers.Load(cmd.ExecuteReader());
cnn.Close();
}
if (newTeamMembers.Rows.Count > 0)
{
sqlTeamMembers.Merge(newTeamMembers);
}
gvTeamMembers.DataSource = sqlTeamMembers;
gvTeamMembers.DataBind();
try
{
for (int i = 0; i < gvTeamMembers.Rows.Count; i++)
{
DropDownList ddlTeamRole = gvTeamMembers.Rows[i].Cells[2].FindControl("ddlTeamRole") as DropDownList;
string txtTeamRole = sqlTeamMembers.Rows[i][2].ToString();
txtTeamRole = txtTeamRole.Replace("'", "''");
ddlTeamRole.SelectedValue = txtTeamRole;
}
}
catch (Exception ex)
{
ScriptManager.RegisterClientScriptBlock(Page, typeof(Page), "class", "alert(\"There was an error: " + ex + "\");", true);
}
}
selectedIndexChanged()
{
cnn.Open();
sqlStr = "SELECT [ID], [LastName]+', '+[FirstName] AS [Name], ISNULL([TeamRole], '') AS [TeamRole], ISNULL([TeamID], '0') FROM [Employees] WHERE [ID] = " + ddlAllEmployees.SelectedValue + ";";
cmd = new SqlCommand(sqlStr, cnn);
DataTable addOneMember = new DataTable();
addOneMember.Load(cmd.ExecuteReader());
cnn.Close();
int empTeamID = Convert.ToInt32(addOneMember.Rows[0][3]);
/*** If DT has not been used yet, establish columns ***/
if (newTeamMembers.Columns.Count == 0)
{
newTeamMembers.Columns.Add("ID", typeof(int));
newTeamMembers.Columns.Add("Name", typeof(string));
newTeamMembers.Columns.Add("TeamRole", typeof(string));
}
/*** Remove TeamID Column before merging data back to primary DataTable, perform merge ***/
addOneMember.Columns.RemoveAt(3);
newTeamMembers.Merge(addOneMember);
if (empTeamID != 0)
{
sqlStr = "SELECT [TeamLocation]+' | '+[Department]+' | '+[Type]+' | '+[Team]+' | '+[Shift] AS [Team] FROM [Teams] WHERE [ID] =" + empTeamID + ";";
cmd = new SqlCommand(sqlStr, cnn);
cnn.Open();
myreader = cmd.ExecuteReader();
myreader.Read();
string existingTeam = myreader[0].ToString();
myreader.Close();
cnn.Close();
ScriptManager.RegisterClientScriptBlock(Page, typeof(Page), "class", "alert(\"Warning: User is currently assigned to another team. Employee will be removed from " + existingTeam + " when you save this page.\");", true);
}
}
【问题讨论】:
标签: c# asp.net gridview datatable