2011-02-25 120 views
0

我想通過CompanyID使用updatepanel過濾我的數據綁定datagridview。由於某種原因,它無法正常工作。這是我的代碼。謝謝你的幫助!使用DropDown過濾DataGrid

C#

string company_id; 

protected void Page_Load(object sender, EventArgs e) 
{ 

     SqlCommand cmd = new SqlCommand("SELECT CompanyName, CompanyID FROM Company ORDER BY CompanyName", conn); 
     SqlCommand cmd2 = new SqlCommand("SELECT p.ProjectName AS ProjectName, p.ProjectID, p.CompanyID, p.Status AS Status FROM Project p, Company c WHERE p.CompanyID = c.CompanyID AND c.CompanyID = '" + company_id + "' ORDER BY ProjectName", conn); 

     cmd.CommandType = CommandType.Text; 

     SqlDataAdapter da = new SqlDataAdapter(cmd); 

     DataSet ds = new DataSet(); 

     da.Fill(ds); 

     if (!Page.IsPostBack) 
     { 
      company_list.DataSource = ds; 
      company_list.DataTextField = "CompanyName"; 
      company_list.DataValueField = "CompanyID"; 
      company_list.DataBind(); 

      company_list.Items.Insert(0, new System.Web.UI.WebControls.ListItem("-- Please Select Company --")); 


     //cmd2.Connection.Open(); 

      cmd2.CommandType = CommandType.Text; 

      SqlDataAdapter sqlAdapter = new SqlDataAdapter(cmd2); 
      DataSet ds2 = new DataSet(); 
      sqlAdapter.Fill(ds2); 

      Gridview1.DataSource = ds2; 
      Gridview1.DataBind(); 

      conn.Close(); 
     } 

     //cmd2.Connection.Close(); 
     //cmd2.Connection.Dispose(); 
    } 

} 
protected void company_list_SelectedIndexChanged(object sender, EventArgs e) 
{ 

    company_id = company_list.SelectedValue; 

} 

ASP.NET:

<asp:DropDownList ID="company_list" runat="server" 
          onselectedindexchanged="company_list_SelectedIndexChanged" width="175" AutoPostBack="true" /> 

...

<asp:UpdatePanel ID="UpdateGrid" runat="server"> 
       <ContentTemplate> 
          <asp:gridview ID="Gridview1" runat="server" ShowFooter="True" 
         AutoGenerateColumns="False" GridLines="None"> 
.... 

       </ContentTemplate> 
       <Triggers> 
        <asp:AsyncPostBackTrigger ControlID="company_list" /> 
       </Triggers> 
</asp:UpdatePanel> 

回答

0

您應該將網格綁定僅當的IsPostBack的Page_Load和用戶後重新綁定!在SelectedIndexChanged-Eventhandler中從DropDownlist中選擇一個公司,而不是從Page_Load中選擇一個公司。所有事件處理程序都在page_load之後調用,因此您的數據庫查詢爲時尚早。

Page Lifecycle

+0

你能告訴我你的意思嗎? – user618616 2011-02-25 23:40:52

+0

得到它的工作,沒關係......謝謝! – user618616 2011-02-25 23:48:52

0

後面的代碼需要遵循這個模式(使用本地數據源,而不是數據庫的調用):注意

public partial class _default : System.Web.UI.Page 
{ 
    ICollection<Company> companies = new List<Company>() 
     { 
      new Company(1, "company1"), 
      new Company(2, "company2"), 
      new Company(3, "company3") 
     }; 

    ICollection<Project> projects = new List<Project>() 
     { 
      new Project(1, "project1a", 1), 
      new Project(2, "project2a", 2), 
      new Project(3, "project3a", 3), 
      new Project(4, "project1b", 1), 
      new Project(5, "project2b", 2), 
      new Project(6, "project3b", 3), 
     }; 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!Page.IsPostBack) 
     { 
      company_list.DataSource = companies; 
      company_list.DataTextField = "Name"; 
      company_list.DataValueField = "Id"; 
      company_list.DataBind(); 
      company_list.Items.Insert(0, new System.Web.UI.WebControls.ListItem("-- Please Select Company --")); 
     } 
    } 

    protected void company_list_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     DropDownList ddl = sender as DropDownList; 
     Gridview1.DataSource = projects.Where(x => x.CompanyId == Int32.Parse(ddl.SelectedValue)); 
     Gridview1.DataBind(); 
    } 
} 

東西:

  • 您當前的代碼是脆弱的SQL注入攻擊 - 你應該參數化你的SQL查詢而不是連接字符串。