我正在學習創建 C# WPF 桌面應用程式。我想從資料庫中檢索資料并粘貼到資料網格中。我設法檢索了一些資料,并且出現了標題所說的錯誤。
這是資料網格的 XAML 代碼。
<DataGrid Grid.Row="1" x:Name="scenarioDataGrid" CanUserSortColumns="True" IsReadOnly="True" AutoGenerateColumns="True" Grid.ColumnSpan="3" Margin="53,40,53,10" Grid.RowSpan="3">
<DataGrid.Columns>
<DataGridTextColumn x:Name="scenarioNumberColumn" Binding="{Binding scenarioNum}" Header="No." Width="50" IsReadOnly="True"/>
<DataGridTextColumn x:Name="scenarioNameColumn" Binding="{Binding scenarioName}" Header="Scenario Name" Width="*" IsReadOnly="True"/>
<DataGridTextColumn x:Name="scenarioDateColumn" Binding="{Binding scenarioDate}" Header="Date" Width="*" IsReadOnly="True"/>
</DataGrid.Columns>
</DataGrid>
這是我創建的場景類
public class ScenarioData
{
public int scenarioNum { get; set; }
public string? scenarioName { get; set; }
public string? scenarioDate { get; set; }
}
然后這是我用來從資料庫中檢索資料并將其粘貼到資料網格中的代碼
conn.Open();
string sql = "SELECT COUNT(scenarioID) OVER () AS 'Num', scenarioName AS 'Scenario Name', scenarioDate AS 'Scenario Date' FROM tbl_scenario";
SqlCommand cmd = new SqlCommand(sql, conn);
SqlDataReader dr = cmd.ExecuteReader();
if(dr.Read())
{
int dataCount = Convert.ToInt32(dr["Num"].ToString());
List<ScenarioData> dataForDatagrid = new List<ScenarioData>();
while (dr.Read())
{
dataForDatagrid.Add(new ScenarioData()
{
scenarioName = dr["Scenario Name"].ToString(),
scenarioDate = dr["Scenario Date"].ToString(),
});
}
for (int j = 0; j < dataCount; j)
{
scenarioDataGrid.Items.Add(new ScenarioData()
{
scenarioNum = j 1,
scenarioName = dataForDatagrid[j].scenarioName,
scenarioDate = dataForDatagrid[j].scenarioDate,
});
}
這是 SSMS資料庫視圖中的資料庫
這是我運行代碼時得到的執行代碼結果
如果有人能指出我做錯了哪一部分,將不勝感激。先感謝您。
uj5u.com熱心網友回復:
這是因為
第一個
dr.Read()是使用閱讀器的第一條記錄,因此您只填充第二條和第三條記錄以dataForDatagriddataCount值是 3,所以在里面for loop你會要求dataForDatagrid[2],這是不存在的!
此外,你可以擺脫dataCount所有..
List<ScenarioData> dataForDatagrid = new List<ScenarioData>();
while (dr.Read())
{
dataForDatagrid.Add(new ScenarioData()
{
scenarioName = dr["Scenario Name"].ToString(),
scenarioDate = dr["Scenario Date"].ToString(),
});
}
for (int j = 0; j < dataForDatagrid.Count ; j)
{
scenarioDataGrid.Items.Add(new ScenarioData()
{
scenarioNum = j 1,
scenarioName = dataForDatagrid[j].scenarioName,
scenarioDate = dataForDatagrid[j].scenarioDate,
});
}
或者你只是擺脫中間dataForDatagrid集合:
int j = 0;
while (dr.Read())
{
scenarioDataGrid.Items.Add(new ScenarioData()
{
scenarioNum = j,
scenarioName = dr["Scenario Name"].ToString(),
scenarioDate = dr["Scenario Date"].ToString(),
});
}
如果出于任何原因您需要該dataForDatagrid集合,請執行以下操作:
List<ScenarioData> dataForDatagrid = new List<ScenarioData>();
int j = 0;
while (dr.Read())
{
dataForDatagrid.Add(new ScenarioData()
{
scenarioNum = j,
scenarioName = dr["Scenario Name"].ToString(),
scenarioDate = dr["Scenario Date"].ToString(),
});
}
scenarioDataGrid.ItemsSource = dataForDatagrid;
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/504357.html
