2017-02-11 24 views
0

我在我的aspx頁面中有一個gridview和detailsview,並且使用對象數據源來顯示數據,表上的主鍵由2列組成,所以我設置了DataKeyNames = 「ID,STEPCOUNT」 在Gridview1,看到我的網頁下面的代碼:DataKeyNames屬性使用多個數據鍵時性能不佳

<asp:GridView ID="GridView1" DataKeyNames="ID,StepCount" runat="server" AutoGenerateColumns="False" DataSourceID="ObjectDataSource1"> 
    <Columns> 
    <asp:CommandField ShowSelectButton="True" /> 
    <asp:BoundField DataField="ID" HeaderText="ID" SortExpression="ID" /> 
    <asp:BoundField DataField="StepCount" HeaderText="StepCount" SortExpression="StepCount" /> 
    <asp:BoundField DataField="Direction" HeaderText="Direction" SortExpression="Direction" /> 
    <asp:BoundField DataField="StatusChangeTo" HeaderText="StatusChangeTo" SortExpression="StatusChangeTo" /> 
    </Columns> 
</asp:GridView> 
<br /> 
<asp:DetailsView ID="DetailsView1" DataKeyNames="ID,StepCount" runat="server" Height="50px" Width="125px" AutoGenerateRows="False" 
    DataSourceID="ObjectDataSource2"> 
    <Fields> 
    <asp:BoundField DataField="ID" HeaderText="ID" SortExpression="ID" /> 
    <asp:BoundField DataField="StepCount" HeaderText="StepCount" SortExpression="StepCount" /> 
    <asp:BoundField DataField="Direction" HeaderText="Direction" SortExpression="Direction" /> 
    <asp:BoundField DataField="StatusChangeTo" HeaderText="StatusChangeTo" SortExpression="StatusChangeTo" /> 
    <asp:BoundField DataField="TicketID" HeaderText="TicketID" SortExpression="TicketID" /> 
    <asp:BoundField DataField="StandaloneIncident" HeaderText="StandaloneIncident" SortExpression="StandaloneIncident" /> 
    <asp:BoundField DataField="CETransactionXML" HeaderText="CETransactionXML" SortExpression="CETransactionXML" /> 
    </Fields> 
</asp:DetailsView> 
<br /> 
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" SelectMethod="getAllMastterChildren" 
    TypeName="HarnessMaintain.Pages.DataAccessLayer"></asp:ObjectDataSource> 
<br /> 
<asp:ObjectDataSource ID="ObjectDataSource2" runat="server" SelectMethod="getMasterchildByPK" 
    TypeName="HarnessMaintain.Pages.DataAccessLayer"> 
    <SelectParameters> 
    <asp:ControlParameter ControlID="GridView1" Name="ID" PropertyName="SelectedValue" 
     Type="Int32" /> 
    <asp:ControlParameter ControlID="GridView1" Name="StepCount" PropertyName="SelectedValue" 
     Type="Int32" /> 
    </SelectParameters> 
</asp:ObjectDataSource> 

以下是根據從GridView的選用ID和STEPCOUNT我的C#代碼檢索數據:

public static List<MasterChildDetail> getMasterchildByPK(int ID, int StepCount) 
{ 
    string sqlStr = "select * from mswscemasterchild where id = :id and step_count = :step_count"; 
    List<MasterChildDetail> mcds = new List<MasterChildDetail>(); 
    MasterChildDetail mcd = new MasterChildDetail(); 
    using (OracleConnection ocon = new OracleConnection(conStr)) 
    { 
    OracleCommand ocmd = new OracleCommand(sqlStr, ocon); 
    ocmd.Parameters.Add(":id", ID); 
    ocmd.Parameters.Add(":step_count", StepCount); 

    ocmd.Connection.Open(); 
    OracleDataReader reader = ocmd.ExecuteReader(); 
    while (reader.Read()) 
    { 
     mcd.ID = Convert.ToInt32(reader["ID"]); 
     mcd.StepCount = Convert.ToInt32(reader["STEP_COUNT"]); 
     if (System.DBNull.Value.Equals(reader["DIRECTION"])) 
     { 
     mcd.Direction = null; 
     } 
     else 
     { 
     mcd.Direction = reader["DIRECTION"].ToString(); 
     } 

     if (System.DBNull.Value.Equals(reader["STATUS_CHANGE_TO"])) 
     { 
     mcd.StatusChangeTo = null; 
     } 
     else 
     { 
     mcd.StatusChangeTo = reader["STATUS_CHANGE_TO"].ToString(); 
     } 

     if (System.DBNull.Value.Equals(reader["TICKET_ID"])) 
     { 
     mcd.TicketID = null; 
     } 
     else 
     { 
     mcd.TicketID = reader["TICKET_ID"].ToString(); 
     } 

     if (System.DBNull.Value.Equals(reader["STANDALONE_INCIDENT"])) 
     { 
     mcd.StandaloneIncident = null; 
     } 
     else 
     { 
     mcd.StandaloneIncident = reader["STANDALONE_INCIDENT"].ToString(); 
     } 

     if (System.DBNull.Value.Equals(reader["CE_TRANSACTION_XML"])) 
     { 
     mcd.CETransactionXML = null; 
     } 
     else 
     { 
     mcd.CETransactionXML = reader["CE_TRANSACTION_XML"].ToString(); 
     } 

     mcds.Add(mcd); 
     break; 
    } 
    } 
    return mcds; 
}  

通過調試,我發現一個有線問題,通過ID和StepCount的價值是一個lways完全一樣,即使我在第二點擊「選擇」第三「選擇」,見下圖:

enter image description here

你能告訴我爲什麼或如何解決這個問題?

回答

0

數據庫的主鍵列是您的DataKey名稱。而且你不能在1個表中有2個主鍵。所以在GridView的DataKey名稱中應該只有1列。

+0

表中的主鍵是(ID,StepCount),兩列的組合可以唯一標識表中的一行 – user2575502

+0

然後在select語句中連接兩列併爲其指定一個列名稱並嘗試設置爲: DataKeyName'Select *,(ID + StepCount)as msgscemasterchild'GridKey'然後在你的GridVIew中添加DataKeyName DataKeyNames = GridKey –