2014-12-05 5 views
0

dsCustomers라는 데이터 집합을 사용하는 작업 표가 있습니다. gridview (키 누름 검색시)를 검색 할 수 있도록 변경하려고합니다. sqlDataReader를 사용하여 채워진 DataTable을 사용하여 검색 프로세스를 수행했습니다 (연결을 만든 다음 SQL SELECT를 실행). 그러나 sqlDataReader는 외부 소스 (데이터베이스 외부)로부터 채워지는 일부 데이터가 있기 때문에 원하는 모든 데이터 필드를 제공하지 않습니다. 따라서 DataTable에 dsCustomers 데이터 집합을 채워야합니다.C에서 데이터 집합을 사용하여 datatable을로드하는 방법 #

<%@ Page Language="C#" MasterPageFile="~/Master.master" AutoEventWireup="true" Inherits="Customers" Title="Customers" Codebehind="Customers.aspx.cs" EnableEventValidation="false"%> 

    <%@ Register assembly="System.Web.Entity, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" namespace="System.Web.UI.WebControls" tagprefix="asp" %> 
    <%@ Import Namespace="System.Data" %> 
    <%@ Import Namespace="System.Data.SqlClient"%> 
    <asp:Content ID="cntMain" ContentPlaceHolderID="plcMainBody" runat="Server"> 
    <script runat="server"> 
     SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["DatabaseConnectionString"].ToString()); 
      SqlCommand cmd = new SqlCommand(); 
      DataView dv = new DataView(); 


      DataTable dt = new DataTable(); 
      DataTable dtsort = new DataTable(); 


      private DataTable DataTable 
      { 
       get { return (DataTable)Session["DataTable"]; } 
       set { Session["DataTable"] = value; } 
      } 
      private DataView DataView 
      { 
       get { return (DataView)Session["DataView"]; } 
       set { Session["DataView"] = value; } 
      } 
      protected override void OnLoad(EventArgs e) 
      { 
       base.OnLoad(e); 
       if (!this.IsPostBack) 
       { 
        DataTable dt; 

        if (this.DataTable == null) 
         LoadDataToTable(); 
        else dt = this.DataTable; 
        this.txtNumber.Attributes.Add("onkeyup", string.Format("javascript:__doPostBack('{0}','')", this.upnlGridView.ClientID)); 
       } 
       else 
       { 
        string target = this.Request.Form["__EVENTTARGET"]; 
        if (!string.IsNullOrEmpty(target) && target.Equals(this.upnlGridView.ClientID)) 
        { 
         if (!string.IsNullOrEmpty(this.txtNumber.Text)) 
         { 
          Filter(); 
         } 
         else 
         { 
          this.grvItems.DataSource = this.DataTable; 
          this.grvItems.DataBind(); 
         } 
        } 
       } 
      } 
      private void Filter() 
      { 
       if (!string.IsNullOrEmpty(this.txtNumber.Text)) 
       { 
        DataRow[] rows = this.DataTable.Select(string.Format("ID LIKE '%{0}%'", this.txtNumber.Text)); 
        this.grvItems.DataSource = this.LoadData(rows); 
        this.grvItems.DataBind(); 
       } 
      } 


      private void LoadDataToTable() 
      { 
     //   con.Open(); 
     //   cmd.Connection = con; 
     //   cmd.CommandText = "select * from Users";    --I NEED TO USE THE DATASET   //  RETURN HERE (dsCustomers) 
    //  cmd.CommandType = System.Data.CommandType.Text; 
    // 
    //    SqlDataAdapter adapter = new SqlDataAdapter(cmd); 
    //    DataSet dsCustomers = new DataSet(); 
    //   adapter.Fill(dsCustomers); 

       this.grvItems.DataSource = dsCustomers; 
    //    this.grvItems.DataBind(); 
       Session["DataTable"] = dt; 
      } 
      protected void PageIndexChanging(object sender, GridViewPageEventArgs e) 
      { 


      } 
      protected void Sorting(object sender, GridViewSortEventArgs e) 
      { 
       BindData(e.SortExpression); 
      } 


      private void BindData(string sortExpression) 
      { 
       // reset the dataview, else it will be undefined value! 
       dv = (DataView)Session["DataView"]; 
       if (sortExpression.Length > 0) 
       { 
        dv.Sort = sortExpression; 
        // save the dataview in stateless environment 
        Session["DataView"] = dv; 
       } 
       this.grvItems.DataSource = dv; 
       this.grvItems.DataBind(); 
      } 
      private DataTable LoadData() 
      { 
       return this.LoadData(null); 
      } 
      private DataTable LoadData(DataRow[] rows) 
      { 
       DataTable dt = this.GetTable(); 


       if (rows != null) 
       { 
        foreach (DataRow r in rows) 
        { 
         dt.Rows.Add(r[0], r[1]); 
        } 


       } 
       dv = dt.DefaultView; 
       Session["DataView"] = dv; 
       return dt; 
      } 
      private DataTable GetTable() 
      { 
       DataTable dt = new DataTable(); 
       dt.Columns.Add("ID", String.Empty.GetType()); 
       dt.Columns.Add("Role", String.Empty.GetType()); 
       return dt; 
      } 
     </script> 


    </head> 
    <body> 

     <asp:ScriptManager runat="server" ID="PageScriptManager" /> 
     Search EID: 
     <asp:TextBox runat="server" ID="txtNumber" AutoPostBack="true" /> 

     <asp:UpdatePanel runat="server" ID="upnlGridView"> 
      <ContentTemplate> 
       <hr /> 
       <asp:GridView runat="server" ID="grvItems" AllowPaging="True" AllowSorting="True" 
        AutoGenerateColumns="False" PageSize="20" OnRowEditing="grvItems_RowEditing" 
         ShowFooter="True" OnRowCommand="grvItems_RowCommand" 
        OnRowCreated="grvItems_RowCreated" OnRowDeleted="grvItems_RowDeleted" 
        CellPadding="5" DataSourceID="dsCustomers"> 
         <AlternatingRowStyle CssClass="DataGridAlternate" /> 
         <RowStyle CssClass="DataGridItemStyle" /> 
         <HeaderStyle CssClass="Header"></HeaderStyle> 
         <FooterStyle CssClass="DataGridAlternate"></FooterStyle> 
         <Columns> 
          <asp:TemplateField> 
           <HeaderStyle HorizontalAlign="Center" Width="40px" VerticalAlign="Middle" /> 
           <ItemStyle HorizontalAlign="Center" /> 
           <ItemTemplate> 
            <asp:ImageButton runat="server" ImageUrl="images/icon-pencil.gif" AlternateText="Edit" 
             CommandName="Edit" CausesValidation="False" ID="btnEdit"></asp:ImageButton> 
            <asp:ImageButton runat="server" ImageUrl="images/icon-delete.gif" AlternateText="Delete" 
             CommandName="Delete" CausesValidation="False" ID="btnDelete" OnClientClick="return confirm('Are you sure you want to delete?');"> 
            </asp:ImageButton> 
           </ItemTemplate> 
          </asp:TemplateField> 
          <asp:BoundField DataField="ID" HeaderText="ID" SortExpression="ID" /> 
          <asp:BoundField DataField="Role" HeaderText="Role" SortExpression="Role" /> 
          <asp:BoundField DataField="FirstName" HeaderText="First Name" SortExpression="FirstName" /> 
          <asp:BoundField DataField="LastName" HeaderText="Last Name" SortExpression="LastName" /> 
          <asp:BoundField DataField="Title" HeaderText="Title" SortExpression="Title" /> 
          <asp:BoundField DataField="PhoneNumber" HeaderText="Phone Number" SortExpression="PhoneNumber" /> 
          <asp:BoundField DataField="LOCATION" HeaderText="Location" SortExpression="dsCustomers" /> 
         </Columns> 
       </asp:GridView> 
      </ContentTemplate> 
     </asp:UpdatePanel> 


     <table width="100%"> 
      <tr> 
       <td width="10%">&nbsp;</td> 
       <td align="left"> 
        <asp:Label ID="lblMessage" runat="server" Text="" CssClass="error"></asp:Label> 
       </td> 
      </tr> 


       </td> 
      </tr> 
     </table> 
     <asp:ObjectDataSource ID="dsCustomers" runat="server" SelectMethod="GetDataDictionary" 
      TypeName="DataObjects.dsCustomers " InsertMethod="AddUpdate" 
      UpdateMethod="AddUpdate" DeleteMethod="Delete"> 
      <SelectParameters> 
       <asp:Parameter Name="ID" Type="String" ConvertEmptyStringToNull="False" DefaultValue="ALL" /> 
      </SelectParameters> 
      <UpdateParameters> 
       <asp:Parameter Name="ID" Type="String" /> 
       <asp:Parameter Name="Role" Type="String" /> 
      </UpdateParameters> 
      <InsertParameters> 
       <asp:Parameter Name="ID" Type="String" /> 
       <asp:Parameter Name="Role" Type="String" /> 
      </InsertParameters> 
      <DeleteParameters> 
       <asp:Parameter Name="EID" Type="String" /> 
      </DeleteParameters> 
     </asp:ObjectDataSource> 


    </asp:Content> 

누군가가이 작업을 수행하는 방법에 대한 몇 가지 지침이나 방향을 제시하시기 바랍니다 수 :

여기에 전체 코드는? 감사

+0

이 오류는 GridView의 데이터 소스에서'DataSet'을 (를) 캐스팅하지 않고 가져 오는 중임을 나타냅니다. 사용 :'dsCustomers = DataSet으로서의 grvItems.DataSource; – Habib

+0

@Habib : 그들은 현재 DataTable을 사용하고있는 것을 제외하고 ... 캐스트가 실패합니다. 그들은'DataSet'을로드하기 위해'SqlDataAdapter'를 사용해야합니다. –

+0

@TrueBlueAussie, 내가 틀린 질문을 읽을 수도 있겠지만, 현재 코드는 기존 Gridview 또는 * something *에서 'DataSet'을 사용하여 변경해야한다고 생각합니다. 그것은 OP까지입니다. – Habib

답변

1

사용하십시오 SqlDataAdapter :

private void LoadDataToTable() 
{ 
    con.Open(); 
    cmd.Connection = con; 
    cmd.CommandText = "select * from Users"; 
    cmd.CommandType = System.Data.CommandType.Text; 

    SqlDataAdapter adapter = new SqlDataAdapter(cmd); 
    DataSet dataset = new DataSet(); 
    adapter.Fill(dataset); 

    this.grvItems.DataSource = dataset; 
    this.grvItems.DataBind(); 
    Session["DataTable"] = dt; 
} 

Tim Schmelter로 포인트를 밖으로, 당신은 너무 오랫동안 연결이 열려 싶지는 않지만 표시 현재 코드 나 리팩토링을 허용하지 않습니다. 가능한 한 빨리 (모든

DataSet ds = new DataSet(); 
using(var con = new SqlConnection("Connection-String")) 
using (var da = new SqlDataAdapter("select * from Users", con)) 
{ 
    // you don't need to use con.Open which is done by Fill automatically 
    da.Fill(ds); 
} 

참고 연결을 닫아야합니다 : 난 그냥 DataTableDataSet를 작성, 즉각적인 문제 :

+0

처음으로 'DataSource와 DataSourceID가 모두'grvItems '에 정의되었습니다. 하나의 정의를 제거하십시오. ' 열에 값을 검색 할 때 행을 찾을 수 없습니다. DataTable이 채워지지 않은 것 같습니다. 또한 dataset dataset = new DataSet(); dsCustomers를 사용하여 데이터 집합을 업데이트했습니다. 선. – user1774445

+0

사실 필자는 필 (fill)과 데이터 소스 (dataSource) 사이의 충돌이라고 생각합니다. DataSource를'dataset' 대신'adapter'로 설정해보십시오 (직접 시도하지 않음). –

+0

위의 전체 코드를 업로드했습니다. – user1774445

0

당신은 모두에게 SqlDataAdapter을 사용할 수 있습니다에 집중하고있다 ASP.NET에서 더 많이), 그 이유는 내가 using을 사용했기 때문입니다. 연결 풀링 (기본값)을 닫으면 연결이 "사용되지 않음"으로 표시됩니다.

관련 문제