2016-12-27 3 views
0

표보기를 사용하여 여러 테이블 (Empdetail, Department, Country, State, City, Qualification)의 조인을 표시하려고합니다. 기본 테이블 (Empdetail)에는 테이블에있는 기본 키 ID를 참조하는 다른 ID (예 : DeptID)가 있습니다. 부서 (및 기타 필드)가 GridView를 업데이트하는 동안 드롭 다운 선택 항목으로 표시되기를 원하지만 드롭 다운 목록을 채우고 편집 버튼을 실행하는 동안 문제를 직면하고 있습니다. 다음은 코드입니다.Gridview의 편집 단추가 작동하지 않습니다.

.ASPX

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Database.aspx.cs" Inherits="Default2" %> 
 

 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
 

 
<html xmlns="http://www.w3.org/1999/xhtml"> 
 
<head runat="server"> 
 
    <title>Employee Database</title> 
 
    <script src="Themes/js/bootstrap.js" type="text/javascript"></script> 
 
    <script src="Themes/js/jquery.min.js" type="text/javascript"></script> 
 
    <script src="Themes/js/npm.js" type="text/jahttp://www.aspsnippets.com/Articles/Simple-Insert-Select-Edit-Update-and-Delete-in-ASPNet-GridView-control.aspxvascript"></script> 
 
    <script src="Themes/js/bootstrap.min.js" type="text/javascript"></script> 
 
    <script type = "text/javascript" src = "Scripts/jquery-1.3.2.min.js"></script> 
 
    <script type = "text/javascript" src = "Scripts/jquery.blockUI.js"></script> 
 
    <script type = "text/javascript"> 
 
     //to create a loading effect 
 
     function BlockUI(elementID) { 
 
     var prm = Sys.WebForms.PageRequestManager.getInstance(); 
 
     prm.add_beginRequest(function() { 
 
     $("#" + elementID).block({ message: '<table align = "center"><tr><td>' + 
 
     '<img src="Images/loadingAnim.gif"/></td></tr></table>', 
 
     css: {}, 
 
     overlayCSS: {backgroundColor:'#000000',opacity: 0.6, border:'3px solid #63B2EB' 
 
     } 
 
     }); 
 
     }); 
 
     prm.add_endRequest(function() { 
 
      $("#" + elementID).unblock(); 
 
     }); 
 
     } 
 
     $(document).ready(function() { 
 
     
 
       BlockUI("dvGrid"); 
 
       $.blockUI.defaults.css = {};   
 
     }); 
 
</script> 
 
    <link href="Themes/css/bootstrap-theme.min.css" rel="stylesheet" type="text/css" /> 
 
    <link href="Themes/css/bootstrap.css" rel="stylesheet" type="text/css" /> 
 
    <link href="Themes/css/bootstrap-theme.css" rel="stylesheet" type="text/css" /> 
 
</head> 
 
<body> 
 
    <form id="form1" runat="server"> 
 
    <div id = "dvGrid"> 
 
     <asp:ScriptManager runat="server" ID="sm"> 
 
     </asp:ScriptManager> 
 
     <asp:UpdatePanel ID="UpdatePanel2" runat="server"> 
 
     <ContentTemplate> 
 
      <asp:GridView ID="GridView1" runat="server" Width = "900px" AlternatingRowStyle-BackColor = "#b3e6ff" 
 
         AutoGenerateColumns="false" AllowPaging="true" OnRowDataBound="OnRowDataBound" 
 
         HeaderStyle-BackColor = "#0080ff" DataKeyNames="ID" 
 
         PageSize="10" class="table table-bordered" ShowFooter="true" 
 
         onrowediting="EditEmployee" onrowupdating="UpdateEmployee" 
 
         onrowcancelingedit="CancelEdit" OnRowDeleting="DeleteEmployee" 
 
         EmptyDataText="No records Selected."> 
 
      <Columns > 
 
       
 
       <asp:TemplateField > 
 
        <ItemTemplate> 
 
         <asp:Label ID="lblID" runat="server" 
 
            Text='<%# Eval("ID") %>' /><!--Primary key,no update and insert,auto generated--> 
 
        </ItemTemplate>  
 
       </asp:TemplateField> 
 
       
 
       <asp:TemplateField ItemStyle-Width = "30px" HeaderText = "EmpCode"> 
 
        <ItemTemplate> 
 
         <asp:Label ID="lblEmpCode" runat="server" 
 
            Text='<%# Eval("EmpCode")%>'> 
 
         </asp:Label> 
 
        </ItemTemplate> 
 
        <EditItemTemplate> 
 
         <asp:TextBox ID="txtEmpCode" runat="server" 
 
            Text='<%# Eval("EmpCode")%>'> 
 
         </asp:TextBox> 
 
        </EditItemTemplate> 
 
        <FooterTemplate> 
 
         <asp:TextBox ID="txtEmpCode" class="form-control" Width = "60px" 
 
            MaxLength = "5" runat="server"> 
 
         </asp:TextBox> 
 
        </FooterTemplate> 
 
       </asp:TemplateField> 
 
       
 
       <asp:TemplateField ItemStyle-Width = "30px" HeaderText = "Name"> 
 
        <ItemTemplate> 
 
         <asp:Label ID="lblName" runat="server" 
 
            Text='<%# Eval("EmpName")%>'> 
 
         </asp:Label> 
 
        </ItemTemplate> 
 
        <EditItemTemplate> 
 
         <asp:TextBox ID="txtName" runat="server" 
 
            Text='<%# Eval("EmpName")%>'> 
 
         </asp:TextBox> 
 
        </EditItemTemplate> 
 
        <FooterTemplate> 
 
         <asp:TextBox ID="txtName" class="form-control" Width = "60px" 
 
            MaxLength = "5" runat="server"> 
 
         </asp:TextBox> 
 
        </FooterTemplate> 
 
       </asp:TemplateField> 
 
       
 
       <asp:TemplateField ItemStyle-Width = "30px" HeaderText = "DOJ"> 
 
        <ItemTemplate> 
 
         <asp:Label ID="lblDOJ" runat="server" 
 
            Text='<%# Eval("DOJ")%>'> 
 
         </asp:Label> 
 
        </ItemTemplate> 
 
        <EditItemTemplate> 
 
         <asp:TextBox ID="txtDOJ" runat="server" 
 
            Text='<%# Eval("DOJ")%>'> 
 
         </asp:TextBox> 
 
        </EditItemTemplate> 
 
        <FooterTemplate> 
 
         <asp:TextBox ID="txtDOJ" class="form-control" Width = "100px" 
 
            MaxLength = "15" runat="server"> 
 
         </asp:TextBox> 
 
        </FooterTemplate> 
 
       </asp:TemplateField> 
 
       
 
       <asp:TemplateField ItemStyle-Width = "120px" HeaderText = "Department"> 
 
        <ItemTemplate> 
 
         <asp:Label ID="lblDepartment" runat="server" 
 
            Text='<%# Eval("DeptName")%>'> 
 
         </asp:Label> 
 
        </ItemTemplate> 
 
        <EditItemTemplate> 
 
         <asp:DropDownList ID = "Depddl" runat="server" Width="100px" > 
 
         </asp:DropDownList> 
 
        </EditItemTemplate> 
 
        <FooterTemplate> 
 
         <asp:TextBox class="form-control" ID="txtDepartment" Width = "140px" 
 
            MaxLength = "5" runat="server"> 
 
         </asp:TextBox> 
 
        </FooterTemplate> 
 
       </asp:TemplateField> 
 
       
 
       <asp:TemplateField ItemStyle-Width = "30px" HeaderText = "Country"> 
 
        <ItemTemplate> 
 
         <asp:Label ID="lblCountry" runat="server" 
 
            Text='<%# Eval("CoName")%>'> 
 
         </asp:Label> 
 
        </ItemTemplate> 
 
        <FooterTemplate> 
 
         <asp:TextBox ID="txtCountry" class="form-control" Width = "60px" 
 
            MaxLength = "5" runat="server"> 
 
         </asp:TextBox> 
 
        </FooterTemplate> 
 
       </asp:TemplateField> 
 
       
 
       <asp:TemplateField ItemStyle-Width = "30px" HeaderText = "State"> 
 
        <ItemTemplate> 
 
         <asp:Label ID="lblState" runat="server" 
 
            Text='<%# Eval("SName")%>'> 
 
         </asp:Label> 
 
        </ItemTemplate> 
 
        <FooterTemplate> 
 
         <asp:TextBox ID="txtState" class="form-control" Width = "60px" 
 
            MaxLength = "5" runat="server"> 
 
         </asp:TextBox> 
 
        </FooterTemplate> 
 
       </asp:TemplateField> 
 
       
 
       <asp:TemplateField ItemStyle-Width = "30px" HeaderText = "City"> 
 
        <ItemTemplate> 
 
         <asp:Label ID="lblCity" runat="server" 
 
            Text='<%# Eval("CiName")%>'> 
 
         </asp:Label> 
 
        </ItemTemplate> 
 
        <FooterTemplate> 
 
         <asp:TextBox ID="txtCity" class="form-control" Width = "60px" 
 
            MaxLength = "5" runat="server"> 
 
         </asp:TextBox> 
 
        </FooterTemplate> 
 
       </asp:TemplateField> 
 
       
 
       <asp:TemplateField ItemStyle-Width = "30px" HeaderText = "Qualification"> 
 
        <ItemTemplate> 
 
         <asp:Label ID="lblQualification" runat="server" 
 
            Text='<%# Eval("QName")%>'> 
 
         </asp:Label> 
 
        </ItemTemplate> 
 
        <FooterTemplate> 
 
         <asp:TextBox ID="txtQualification" class="form-control" Width = "80px" 
 
            MaxLength = "5" runat="server"> 
 
         </asp:TextBox> 
 
        </FooterTemplate> 
 
       </asp:TemplateField> 
 
       
 
       <asp:TemplateField> 
 
        <ItemTemplate> 
 
         <asp:LinkButton ID="lnkRemove" runat="server" 
 
          CommandArgument = '<%# Eval("ID")%>' OnClick = "DeleteEmployee" 
 
          OnClientClick = "return confirm('Do you want to delete?')" 
 
          Text = "Delete" > 
 
         </asp:LinkButton> 
 
        </ItemTemplate> 
 
        <FooterTemplate> 
 
         <asp:Button ID="btnAdd" runat="server" Text="Add" 
 
            class="btn-primary" type="button" OnClick = "AddNewEmployee"/> 
 
        </FooterTemplate> 
 
       </asp:TemplateField> 
 
       <asp:CommandField ShowEditButton="True" /> 
 
       
 
      </Columns> 
 
      </asp:GridView> 
 
     </ContentTemplate> 
 
     <Triggers> 
 
      <asp:AsyncPostBackTrigger ControlID = "GridView1" /> 
 
     </Triggers> 
 
     </asp:UpdatePanel> 
 
    </div> 
 
    </form> 
 
</body> 
 
</html>

Codebehind가 (aspx.cs/C 번호)

using System; 
 
using System.Collections; 
 
using System.Collections.Generic; 
 
using System.Configuration; 
 
using System.Data; 
 
using System.Linq; 
 
using System.Web; 
 
using System.Web.Security; 
 
using System.Web.UI; 
 
using System.Web.UI.HtmlControls; 
 
using System.Web.UI.WebControls; 
 
using System.Web.UI.WebControls.WebParts; 
 
using System.Xml.Linq; 
 
using System.Data.SqlClient; 
 

 
public partial class Default2 : System.Web.UI.Page 
 
{ 
 
    string constr = ConfigurationManager.ConnectionStrings["SQLDbConnection"].ConnectionString; 
 
    protected void Page_Load(object sender, EventArgs e) 
 
    { 
 
     if (!IsPostBack) 
 
     { 
 
      this.BindData(); 
 
      
 
      
 
     } 
 
     
 
    } 
 

 
    
 

 
    protected void EditEmployee(object sender, GridViewEditEventArgs e) 
 
    { 
 
     GridView1.EditIndex = e.NewEditIndex; 
 
     BindData(); 
 
       
 
    } 
 

 
    protected void OnRowDataBound(object sender, GridViewRowEventArgs e) 
 
    { 
 
     if (e.Row.RowType == DataControlRowType.DataRow && GridView1.EditIndex == e.Row.RowIndex) 
 
     { 
 
      //Find the DropDownList in the Row 
 
      SqlConnection con = new SqlConnection(constr); 
 
      DropDownList Depddl = (DropDownList)e.Row.FindControl("Depddl"); 
 
      string query = "SELECT ID,DeptName FROM Department;"; 
 
      SqlCommand cmd = new SqlCommand(query); 
 
      cmd.CommandType = CommandType.Text; 
 
      cmd.Connection = con; 
 
      con.Open(); 
 
      Depddl.DataSource = GetData(cmd); 
 
      Depddl.DataTextField = "DeptName"; 
 
      Depddl.DataValueField = "ID"; 
 
      Depddl.DataBind(); 
 
      con.Close(); 
 

 

 
      //Add Default Item in the DropDownList 
 
      Depddl.Items.Insert(0, new ListItem("Please select")); 
 

 
      //Select the Department ofEmployee in DropDownList 
 
      string Department = (e.Row.FindControl("lblDepartment") as Label).Text; 
 
      Depddl.Items.FindByValue(Department).Selected = true; 
 
     } 
 
    } 
 
    protected void CancelEdit(object sender, GridViewCancelEditEventArgs e) 
 
    { 
 
     GridView1.EditIndex = -1; 
 
     BindData(); 
 
    } 
 
    protected void UpdateEmployee(object sender, GridViewUpdateEventArgs e) 
 
    { 
 
     string city = (GridView1.Rows[e.RowIndex].FindControl("Depddl") as DropDownList).SelectedItem.Value; 
 
     string ID = ((Label)GridView1.Rows[e.RowIndex] 
 
         .FindControl("lblID")).Text; 
 
    
 
     string EmpCode = ((TextBox)GridView1.Rows[e.RowIndex] 
 
          .FindControl("txtEmpCode")).Text; 
 
     string Name = ((TextBox)GridView1.Rows[e.RowIndex] 
 
          .FindControl("txtName")).Text; 
 
     string DOJ = ((TextBox)GridView1.Rows[e.RowIndex] 
 
          .FindControl("txtDOJ")).Text; 
 
     
 
     SqlConnection con = new SqlConnection(constr); 
 
     SqlCommand cmd = new SqlCommand(); 
 
     cmd.CommandType = CommandType.Text; 
 
     cmd.CommandText = "update Empdetail set [email protected]," + "[email protected],"+ "[email protected] where [email protected]; " + 
 
          "select Empdetail.ID, Empdetail.EmpCode, Empdetail.EmpName,Empdetail.DOJ, "+ 
 
          "Department.DeptName, Country.CoName, State.SName, City.CiName, Qualification.QName from "+ 
 
          "Empdetail JOIN Department on Empdetail.DepartmentID=Department.ID JOIN Country on Empdetail.CountryID=Country.ID "+ 
 
          "JOIN State on Empdetail.StateID=State.ID JOIN City on Empdetail.CityID=City.ID "+ 
 
          "JOIN Qualification on Empdetail.QualificationID=Qualification.ID;"; 
 
     cmd.Parameters.Add("@ID", SqlDbType.VarChar).Value = ID; 
 
     cmd.Parameters.Add("@EmpCode", SqlDbType.VarChar).Value = EmpCode; 
 
     cmd.Parameters.Add("@EmpName", SqlDbType.VarChar).Value = Name; 
 
     cmd.Parameters.Add("@DOJ", SqlDbType.VarChar).Value = DOJ; 
 
     GridView1.EditIndex = -1; 
 
     GridView1.DataSource = GetData(cmd); 
 
     GridView1.DataBind(); 
 
    } 
 

 
    protected void DeleteEmployee(object sender, EventArgs e) 
 
    { 
 
     LinkButton lnkRemove = (LinkButton)sender; 
 
     SqlConnection con = new SqlConnection(constr); 
 
     SqlCommand cmd = new SqlCommand(); 
 
     cmd.CommandType = CommandType.Text; 
 
     cmd.CommandText = "delete from Empdetail where " + 
 
     "[email protected];" + 
 
     "select Empdetail.ID, Empdetail.EmpCode, Empdetail.EmpName,Empdetail.DOJ, Department.DeptName, Country.CoName, State.SName, City.CiName, Qualification.QName from Empdetail JOIN Department on Empdetail.DepartmentID=Department.ID JOIN Country on Empdetail.CountryID=Country.ID JOIN State on Empdetail.StateID=State.ID JOIN City on Empdetail.CityID=City.ID JOIN Qualification on Empdetail.QualificationID=Qualification.ID;"; 
 
     cmd.Parameters.Add("@ID", SqlDbType.VarChar).Value 
 
      = lnkRemove.CommandArgument; 
 
     GridView1.DataSource = GetData(cmd); 
 
     GridView1.DataBind(); 
 
    } 
 

 
    private void BindData() 
 
    { 
 
     string query = "select Empdetail.ID, Empdetail.EmpCode, Empdetail.EmpName,Empdetail.DOJ,"+ 
 
         "Department.ID, Department.DeptName, Country.CoName, State.SName, City.CiName, Qualification.QName from "+ 
 
         "Empdetail JOIN Department on Empdetail.DepartmentID=Department.ID JOIN Country on Empdetail.CountryID=Country.ID"+ 
 
         " JOIN State on Empdetail.StateID=State.ID JOIN City on Empdetail.CityID=City.ID"+ 
 
         " JOIN Qualification on Empdetail.QualificationID=Qualification.ID;"; 
 
     SqlCommand cmd = new SqlCommand(query); 
 
     GridView1.DataSource = GetData(cmd); 
 
     GridView1.DataBind(); 
 
    } 
 
    private DataTable GetData(SqlCommand cmd) 
 
    { 
 

 
     DataTable dt = new DataTable(); 
 
     SqlConnection con = new SqlConnection(constr); 
 
     SqlDataAdapter sda = new SqlDataAdapter(); 
 
     cmd.CommandType = CommandType.Text; 
 
     cmd.Connection = con; 
 
     sda.SelectCommand = cmd; 
 
     
 
     sda.Fill(dt); 
 
     return dt; 
 
    } 
 

 
    protected void AddNewEmployee(object sender, EventArgs e) 
 
    { 
 
     string ID = ((TextBox)GridView1.FooterRow.FindControl("txtID")).Text; 
 
     string EmpCode = ((TextBox)GridView1.FooterRow.FindControl("txtEmpCode")).Text; 
 
     string Company = ((TextBox)GridView1.FooterRow.FindControl("txtCompany")).Text; 
 
     SqlConnection con = new SqlConnection(constr); 
 
     SqlCommand cmd = new SqlCommand(); 
 
     cmd.CommandType = CommandType.Text; 
 
     /*cmd.CommandText = "insert into Empdetail(EmpCode, CompanyName) " + 
 
     "values(@CustomerID, @ContactName, @CompanyName);" + 
 
     "select CustomerID,ContactName,CompanyName from customers"; 
 
     cmd.Parameters.Add("@CustomerID", SqlDbType.VarChar).Value = CustomerID; 
 
     cmd.Parameters.Add("@ContactName", SqlDbType.VarChar).Value = Name; 
 
     cmd.Parameters.Add("@CompanyName", SqlDbType.VarChar).Value = Company;*/ 
 
     GridView1.DataSource = GetData(cmd); 
 
     GridView1.DataBind(); 
 
    } 
 

 

 

 
}

,

참고 : - 광범위하게 여러 사이트에서 검색 했으므로 나를 링크로 안내하는 대신 정확한 문제를 말할 수 있다면 정말 감사하겠습니다. 나는 Gridview의 개념에 익숙하지 않으므로 열린 마음으로 코드를 비평 해주십시오. 미리 감사드립니다

답변

0

코드의 여러 세그먼트를 주석 처리 한 후 문제가 "OnRowDataBound"함수에 있음을 알았습니다. 이러한 라인을 언급 다시 업데이트 버튼 화재를 만든 : -

string Department = (e.Row.FindControl("lblDepartment") as Label).Text; 
 
Depddl.Items.FindByValue(Department).Selected = true;

내가이에서 수집 할 수있는 것은 내가 항목 템플릿 제어 그런 식으로 액세스 할 수 있다는 것입니다. 라인에 주석을 달아서 페이지가 부드럽게 돌아갔습니다. 그러나 원래의 데이터 값을 자동으로 선택하는 기능을 잃어 버렸습니다. 나는 이것을 구현하고 싶고 내가 이것을 달성하자마자 업데이트를 게시 할 것이다.

0

aspx 파일에서 각 드롭 다운의 데이터 소스를 드롭합니다 (예 : SqlDataSource). 마크 업에서는 각 DDL을 완전히 정의 할 수 있으며 모든 행은 데이터 소스의 동일한 단일 인스턴스를 사용합니다. 편집시에는 업데이트 할 값만 캡처하면됩니다.

그래서 ... 부서 예를 들어, 데이터 소스 ... 부서의의 GridView 템플릿에서 다음

. . . 
    </asp:GridView> 

    <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
     ConnectionString="<%$ ConnectionStrings:SQLDbConnection %>" 
     SelectCommand="SELECT ID,DeptName FROM Department" 
     EnableCaching="True"> 
    </asp:SqlDataSource> 

...

<EditItemTemplate> 
     <asp:DropDownList ID = "Depddl" runat="server" Width="100px" > 
      DataSourceID="SqlDataSource1"        
      DataTextField="DeptName" 
      DataValueField="ID" 
     </asp:DropDownList> 
    </EditItemTemplate> 

그리고 코드의

것은 당신이 선택 선택적으로 할 수 뒤에 현재 값에서 DDL에 대한 현재 값 ... 또는 최대 ... 당신에게 달려 있습니다.

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
     if (e.Row.RowState.HasFlag(DataControlRowState.Edit)) 
     { 
      DataRowView drv = (DataRowView) e.Row.DataItem; 
      DropDownList ddl = (DropDownList) e.Row.FindControl("DropDownList1"); 
      ddl.SelectedValue = ((int) drv[ "ID" ]).ToString(); 
     } 
    } 
} 
+0

감사합니다. 나는 그러한 통제를 알지 못했다. –

관련 문제