2017-09-14 23 views
0

これは私の最初の投稿です。プログラミングに慣れていません。今、私は、データがSQLデータベースからフェッチされるDataTableの列名を変更しようとしています。 foreachループを使用して列名を変更した後、データテーブルの列名を変更すると、グリッドビューにバインドした直後にプログラムがクラッシュするように見えます。 the error occurC#Datatableの列名が変更される問題

何が原因でエラーが発生しますか?背後

C#コード:

//custom query generator 
Session["query"] = db.generate_query(parameter1, parameter2, parameter3, parameter4); 
//connecting sql 
SqlConnection conn = new SqlConnection("Data Source=USER-PC;Initial Catalog=ISMS;Integrated Security=True"); 
SqlCommand cmd1 = new SqlCommand(Session["query"].ToString(),conn); 
SqlDataAdapter sdal = new SqlDataAdapter(cmd1); 


//when search is needed 
dt_table = new DataTable(); 
sdal.Fill(dt_table); 
// dataTable.Columns["ExistingColumnName"].ColumnName = "regnum"; 
//renaming column in datatable 

foreach (DataColumn dtclm in dt_table.Columns) { 
    dt_table.Columns[dtclm.ToString()].ColumnName = dt_table.Columns[dtclm.ToString()].ColumnName.ToString().Replace("_"," "); 

} 

staff_attendance_gridview.Visible = true; 
staff_attendance_gridview.DataSource = dt_table; 
staff_attendance_gridview.DataBind(); 
result_message.Text = dt_table.Rows.Count.ToString() + " rows in the table"; 

のaspxファイル:

<%@ Page Title="" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="admin_attendance_.aspx.cs" Inherits="ISMS.admin_attendance" %> 
<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" runat="server"> 
<!--start container box--> 
<div id="container_box"> 
<div id="text"> 
<asp:Label runat="server" ID="welcome_message" /><br /> 
<br /> 
<!--search bar--> 
<p> 
<br /> 
    Employee ID: <asp:TextBox runat="server" ID="employee_search" Text="" /><br /> 
    <br /> 
    Attendance ID: <asp:TextBox runat="server" ID="attendance_ID_text_box" Text="" /><br /> 
    <br /> 
    fill up both attendance ID and Employee ID and click delete to delete certain record.<br /> 
    <br /> 
<asp:Button ID="search_btn" runat="server" Text="search" OnClick="search_btn_Click" /> 
<asp:Button ID="clock_in_or_out_btn" runat="server" Text="clock in/out" OnClick="clock_in_or_out_btn_Click" /> 
<asp:Button ID="delete_button" runat="server" Text="delete" OnClick="delete_button_Click" /> 
    <br /> 
</p> 
<!--gridview--> 
    <hr /> 
    <br /> 
<div id="gridview"> 
<asp:GridView runat="server" ID="staff_attendance_gridview" OnPageIndexChanging="gridview_PageIndexChanging" AutoGenerateColumns="true" DataKeyNames="Attendance_id" > 
</asp:GridView> 



</div> 
<!--end gridview--> 
<p> 
<!--validator--> 
<asp:RegularExpressionValidator ID="employee_search_validator" runat="server"  
ErrorMessage="Invalid searching citeria. Only exactly 8 numbers is allowed." 
ControlToValidate="employee_search" 
ValidationExpression="^[0-9]{8}$" /><br /> 
<br /> 
</p> 
<br /> 
<!--hyperlink to main menu--> 
<asp:Label runat="server" ID="result_message" /><br /> 
<a href="admin.aspx" >Main menu</a> 
</div>  
</div> 
<!--end container box--> 
</asp:Content> 

Database table structure

+0

あなたがたDataTableを使用して回避し、適切に[IDisposableを](https://msdn.microsoft.com/en-us/library/system.idisposable(V = vs.110を処理する方法を学ぶ必要があります)。 aspx)。 – mason

+0

okが表示されます。これは私がIDisposable Interfaceを聞いた初めてのことです。それを学びます – moja

+0

あなたはなぜあなたの質問をセッションに保存しますか? – mason

答えて

2

あなたが列Attendance_idを指し、あなたのGridView内の属性を持っています。更新された列の名前Attendance idと一致する必要があります。

IDisposableを正しく処理し、過度に複雑なビットを削除するように、以下のコードを修正しました。

Session["query"] = db.generate_query(parameter1, parameter2, parameter3, parameter4); 

using(SqlConnection conn = new SqlConnection("Data Source=USER-PC;Initial Catalog=ISMS;Integrated Security=True")) 
{ 
    using(SqlCommand cmd1 = new SqlCommand(Session["query"].ToString(), conn)) 
    { 
     using(SqlDataAdapter sdal = new SqlDataAdapter(cmd1)) 
     { 
      dt_table = new DataTable(); 
      sdal.Fill(dt_table); 
     } 
    } 
} 

foreach (DataColumn column in dt_table.Columns) 
{ 
    column.ColumnName = column.ColumnName.Replace("_", " "); 
} 

staff_attendance_gridview.Visible = true; 
staff_attendance_gridview.DataSource = dt_table; 
staff_attendance_gridview.DataBind(); 
result_message.Text = dt_table.Rows.Count + " rows in the table"; 
+0

@moja以前に名前を変更したものを何かが参照しているときにエラーが発生した場合は、自分自身で好きなことをして、古い値をテキスト検索して、他の場所で参照されているかどうかを確認します。 – mason

+0

名前を変更した後でエラーが発生した場合、古い値のテキストを検索します。アドバイスありがとう – moja

関連する問題