C# wpf单选按钮已被选中“;索引超出范围。必须为非负数且小于集合的大小。”;

C# wpf单选按钮已被选中“;索引超出范围。必须为非负数且小于集合的大小。”;,c#,mysql,wpf,radio-button,C#,Mysql,Wpf,Radio Button,首先,我想说,我对WPF真的很陌生 我试图用MySQL数据库中的数据填充datagrid,方法是使用单选按钮进行查询。我想在启动程序时将其中一个单选按钮设置为默认选择。但当我在xaml中将radiobutton设置为“IsChecked=“True”时,我得到一个“Index超出范围。必须为非负且小于集合参数name:Index”的大小。如果我删除IsChecked并再次运行程序并手动选择radiobutton,则没有问题。 谁能告诉我我做错了什么 这不是我的实际代码,它只是获取错误所需的部分代

首先,我想说,我对WPF真的很陌生

我试图用MySQL数据库中的数据填充datagrid,方法是使用单选按钮进行查询。我想在启动程序时将其中一个单选按钮设置为默认选择。但当我在xaml中将radiobutton设置为“IsChecked=“True”时,我得到一个“Index超出范围。必须为非负且小于集合参数name:Index”的大小。如果我删除IsChecked并再次运行程序并手动选择radiobutton,则没有问题。 谁能告诉我我做错了什么

这不是我的实际代码,它只是获取错误所需的部分代码

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
<Grid>
    <DataGrid x:Name="DataGridSpil" Margin="0,30,17,19" CanUserAddRows="false" AutoGenerateColumns="True" ColumnWidth="auto"/>
    <RadioButton Content="Alle" HorizontalAlignment="Left" Margin="0,10,0,0" VerticalAlignment="Top" Checked="RadioButton_Checked"/>
</Grid>

}

这意味着您正在访问集合中不存在的位置或索引。如果调试代码,您会发现您的
Datagrid.Columns.Count=0
,因此,当您尝试获取列[0]时,会出现异常

作为解决方案,试试这个

private void RadioButton_Checked(object sender, RoutedEventArgs e)
{
    try
    {
        MySqlCommand cmd = new MySqlCommand();
        cmd.CommandText = "select titel, genre, release_year, console, ownedby, loaned from spil";
        cmd.Connection = DatabaseConnection.GetDefaultConnection();

        MySqlDataAdapter MyAdapter = new MySqlDataAdapter();
        MyAdapter.SelectCommand = cmd;

        DataTable dTable = new DataTable("spil");

        MyAdapter.Fill(dTable);

        DataGridSpil.ItemsSource = dTable.DefaultView;
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}
您可以在运行时添加列,并绑定到DataTable

xaml

<DataGrid
  Name="DataGridSpil"
  AutoGenerateColumns="False"
  ItemsSource="{Binding}">
</DataGrid>
另一种方法是,如果您知道列名,则在xaml中设置它们

<DataGrid Name="DataGridSpil" AutoGenerateColumns="False">
                        <DataGrid.Columns>
                                <DataGridTextColumn Header="Titel" Binding="{Binding Titel}" />
                                <DataGridTextColumn Header="Genre" Binding="{Binding Genre}" />

                                .....

                                .....
                        </DataGrid.Columns>

</DataGrid>

.....
.....

它与该代码一起工作。但是,我丢失了对所有列标题的重命名。是否要添加它们?我认为您需要像我共享的代码一样在运行时添加列
if (dTable != null) // table is a DataTable
{
  foreach (DataColumn col in dTable.Columns)
  {
    dataGrid.Columns.Add(
      new DataGridTextColumn
      {
        Header = col.ColumnName,
        Binding = new Binding(string.Format("[{0}]", col.ColumnName))
      });
  }

  DataGridSpil.DataContext = table;
}
<DataGrid Name="DataGridSpil" AutoGenerateColumns="False">
                        <DataGrid.Columns>
                                <DataGridTextColumn Header="Titel" Binding="{Binding Titel}" />
                                <DataGridTextColumn Header="Genre" Binding="{Binding Genre}" />

                                .....

                                .....
                        </DataGrid.Columns>

</DataGrid>