[英]Index was out of range. Must be non-negative and less than the size of the collection. C#
[英]C# WPF DataGrid. Index was out of range. Must be non-negative and less than the size of the collection. Parameter 'index'
我正在學習創建 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>
這是我創建的場景 class
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數據庫視圖中的數據庫
這是我運行代碼時得到的執行代碼結果
如果有人能指出我做錯了哪一部分,將不勝感激。 先感謝您。
這是因為
第一個dr.Read()
正在使用讀取器的第一條記錄,因此您僅將第二條和第三條記錄填充到dataForDatagrid
dataCount
值為 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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.