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完全一樣,即使我在第二點擊「選擇」第三「選擇」,見下圖:
你能告訴我爲什麼或如何解決這個問題?
表中的主鍵是(ID,StepCount),兩列的組合可以唯一標識表中的一行 – user2575502
然後在select語句中連接兩列併爲其指定一個列名稱並嘗試設置爲: DataKeyName'Select *,(ID + StepCount)as msgscemasterchild'GridKey'然後在你的GridVIew中添加DataKeyName DataKeyNames = GridKey –