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