簡體   English   中英

C# WPF 數據網格。 指數超出范圍。 必須是非負數且小於集合的大小。 參數“索引”

[英]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數據庫視圖中的數據庫

這是我運行代碼時得到的執行代碼結果

如果有人能指出我做錯了哪一部分,將不勝感激。 先感謝您。

這是因為

  1. 第一個dr.Read()正在使用讀取器的第一條記錄,因此您僅將第二條和第三條記錄填充到dataForDatagrid

  2. 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM