How to make updatable GridView in ItemTemplate
I want to show Employee details in GridView. My client wants that he should be able to update the record without clicking on Edit button to update. Hence I kept everything in the ItemTemplate field of the GridView.
My Database tables are: Emp(EmpNo, EName, Sal, DeptNo) Dept(DeptNo, DeptName, Location)
Hence, I have written one sp to get data: EmpNo, EName, Sal, DeptName
Here, I want to show DeptName field in DropDownList. Here only I am facing the problem. DropDownList is not filling with proper DeptName value, but the first field.
My code-behind is like below:
public partial class GvwEmployee : System.Web.UI.Page
{
SqlConnection objConn = new SqlConnection(System.Web.Configuration.WebConfigurationManager.ConnectionStrings["STERIAConnectionString"].ConnectionString);
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
GridView1.DataSource = EmployeeList;
GridView1.DataBind();
}
}
private List<Employee> EmployeeList
{
get{
List<Employee> employeeList = new List<Employee>();
SqlCommand objCmd = new SqlCommand("usp_GetEmpDetails", objConn);
objCmd.CommandType = CommandType.StoredProcedure;
objConn.Open();
SqlDataReader objDR = objCmd.ExecuteReader();
while (objDR.Read())
{
Employee employee = new Employee();
employee.EmpNo = Convert.ToInt32(objDR["EmpNo"]);
employee.EName = Convert.ToString(objDR["EName"]);
employee.Salary = Convert.ToDouble(objDR["Salary"]);
employee.DeptNo = Convert.ToInt32(objDR["DeptNo"]);
employee.DeptName = Convert.ToString(objDR["DeptName"]);
employeeList.Add(employee);
}
objDR.Close();
objConn.Close();
return employeeList;
}
}
private List<Department> DeptList
{
get
{
List<Department> deptList = new List<Department>();
SqlCommand objCmd = new SqlCommand("usp_GetDeptDetails", objConn);
objCmd.CommandType = CommandType.StoredProcedure;
objConn.Open();
SqlDataReader objDR = objCmd.ExecuteReader();
while (objDR.Read())
{
Department dept = new Department();
dept.DeptNo = Convert.ToInt32(objDR["DEPTNO"]);
dept.DName = Convert.ToString(objDR["DNAME"]);
dept.Location = Convert.ToString(objDR["Location"]);
deptList.Add(dept);
}
objDR.Close();
objConn.Close();
return deptList;
}
}
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
DropDownList ddlDeptName = e.Row.FindControl("ddlDeptName") as DropDownList;
if (ddlDeptName != null)
{
ddlDeptName.DataSource = DeptList;
ddlDeptName.DataBind();
ddlD开发者_如何学CeptName.SelectedValue = GridView1.DataKeys[e.Row.RowIndex].Value.ToString();
}
}
if (e.Row.RowType == DataControlRowType.Footer)
{
}
}
}
Can anyone please tell where is the problem, why DeptName DropDownList is not filling with its proper values?
Try this way
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
var index = Convert.ToInt32(e.RowIndex.ToString());
GridViewRow row = GridView1.Rows[index];
var ddlDeptName = row.FindControl("ddlDeptName") as ddlDeptName;
if (ddlDeptName != null)
{
ddlDeptName.DataSource = DeptList;
ddlDeptName.DataTextField = "DName";
ddlDeptName.DataValueField = "DeptNo";
ddlDeptName.DataBind();
var item = new ListItem("Select Department", "");
ddlDeptName.Items.Insert(0, item);
}
}
}
I got the solution like below:
In the GridView1_RowDataBound event method, I have written the following line of code to map DropDownList with the Data got from Backend.
//ddlDeptName.SelectedValue = GridView1.DataKeys[e.Row.RowIndex].Value.ToString();
Now, I have replaced the above line with the following line of code, and hence the problem was solved:
ddlDeptName.SelectedValue = ((Employee)e.Row.DataItem).DeptNo.ToString();
and this has solved my problem.
精彩评论