DataGrid를 조작하려고하면 인덱스 오류가 발생합니다.
사건
WPF 앱으로 Window에 DataGrid를 설치했다. Window를 초기화할 때 DataGrid의 열 속성을 조작하려고 하면 오류가 발생했습니다.
오류 내용
System.ArgumentOutOfRangeException
색인이 범위를 벗어났습니다. 음이 아닌 값으로 컬렉션의 크기보다 작아야 합니다.
매개변수 이름: index
상세
표시하고 싶었던 것은 이쪽의 화면. DataGrid가 일람표로 되어 있어, 보존이나 삭제의 버튼이 있다.
xaml은 이쪽.
Terminals.xaml<Window x:Name="端末登録" x:Class="SkillAttacher.Admin.Terminals"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="端末登録" Height="700" Width="600" ResizeMode="NoResize" WindowStartupLocation="CenterScreen" Icon="/SkillAttacher;component/rect3063.ico">
<WrapPanel>
<StackPanel>
<Label x:Name="Error" Content="" Margin="30,20,0,0" Foreground="Red"></Label>
<DataGrid x:Name="GridTerminals" HorizontalAlignment="Left" Margin="30,10,0,0" VerticalAlignment="Top" Height="570" Width="400" RenderTransformOrigin="0.5,0.5"
SelectionMode="Single" SelectionUnit="CellOrRowHeader" CanUserResizeColumns="False" CanUserReorderColumns="False" CanUserResizeRows="False" CanUserDeleteRows="False"
RowEditEnding="DataGrid_Edit" AddingNewItem="DataGrid_Edit" CanUserSortColumns="False">
<DataGrid.RenderTransform>
<TransformGroup>
<ScaleTransform/>
<SkewTransform/>
<TranslateTransform/>
</TransformGroup>
</DataGrid.RenderTransform>
</DataGrid>
</StackPanel>
<StackPanel>
<Button x:Name="Regist" Content="保存" HorizontalAlignment="Left" Height="65" Margin="30,395,0,0" VerticalAlignment="Top" Width="100" Click="Regist_Click"/>
<Button x:Name="Delete" Content="削除" HorizontalAlignment="Left" Height="65" Margin="30,20,0,0" VerticalAlignment="Top" Width="100" Click="Delete_Click"/>
<Button x:Name="Back" Content="戻る" HorizontalAlignment="Left" Height="45" Margin="30,40,0,0" VerticalAlignment="Top" Width="100" Click="Back_Click"/>
</StackPanel>
</WrapPanel>
</Window>
xaml.cs는 여기 (발췌). 생성자로부터 호출한 메소드 중에서 DataGrid의 Colmun을 조작하는 부분에서 에러가 발생했다.
Terminals.xaml.cs
/// <summary>
/// コンストラクタ
/// </summary>
public Terminals()
{
InitializeComponent();
SetData();
}
/// <summary>
/// データグリッドにデータをバインド
/// </summary>
private void SetData()
{
var ds = new DataSet();
try
{
conn = new SqlConnection(Define.CONN_STR);
conn.Open();
string qry = "SELECT * FROM Terminals WHERE IsDelete='False' ORDER BY TerminalDisplayOrder ASC;";
adapter = new SqlDataAdapter(qry, conn);
adapter.SelectCommand.CommandType = CommandType.Text;
adapter.Fill(ds);
}
catch (Exception ex)
{
// 省略
}
GridTerminals.ItemsSource = ds.Tables[0].DefaultView;
GridTerminals.Columns[0].Width = 150;
GridTerminals.Columns[1].Width = 210;
GridTerminals.Columns[0].Header = HEADER_TERMINAL_CD;
GridTerminals.Columns[1].Header = HEADER_TERMINAL_IP_ADDRESS;
}
데이터를 DB로부터 취득해, 바인드 하고 있어 DataGrid의 Items에는 몇개의 데이터가 들어가 있다. 그러나 DataGrid의 Columns.Count는 0입니다.
열수가 0인데 제1열째를 장식하려고 했기 때문에, 떨어지고 버렸다.
해결 방법
/// <summary>
/// コンストラクタ
/// </summary>
public Terminals()
{
InitializeComponent();
//SetData();
ContentRendered += (s, e) => SetData();
}
화면이 렌더링되기 전에 DataGrid 열을 조작하려고 했기 때문입니다.
ContentRenderd의 이벤트에 문제의 메소드를 추가해, 렌더링 후에 실시하도록(듯이) 하면, 제대로 움직였다.
Reference
이 문제에 관하여(DataGrid를 조작하려고하면 인덱스 오류가 발생합니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/miltood/items/197c1eaa38ed159a1b06
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
<Window x:Name="端末登録" x:Class="SkillAttacher.Admin.Terminals"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="端末登録" Height="700" Width="600" ResizeMode="NoResize" WindowStartupLocation="CenterScreen" Icon="/SkillAttacher;component/rect3063.ico">
<WrapPanel>
<StackPanel>
<Label x:Name="Error" Content="" Margin="30,20,0,0" Foreground="Red"></Label>
<DataGrid x:Name="GridTerminals" HorizontalAlignment="Left" Margin="30,10,0,0" VerticalAlignment="Top" Height="570" Width="400" RenderTransformOrigin="0.5,0.5"
SelectionMode="Single" SelectionUnit="CellOrRowHeader" CanUserResizeColumns="False" CanUserReorderColumns="False" CanUserResizeRows="False" CanUserDeleteRows="False"
RowEditEnding="DataGrid_Edit" AddingNewItem="DataGrid_Edit" CanUserSortColumns="False">
<DataGrid.RenderTransform>
<TransformGroup>
<ScaleTransform/>
<SkewTransform/>
<TranslateTransform/>
</TransformGroup>
</DataGrid.RenderTransform>
</DataGrid>
</StackPanel>
<StackPanel>
<Button x:Name="Regist" Content="保存" HorizontalAlignment="Left" Height="65" Margin="30,395,0,0" VerticalAlignment="Top" Width="100" Click="Regist_Click"/>
<Button x:Name="Delete" Content="削除" HorizontalAlignment="Left" Height="65" Margin="30,20,0,0" VerticalAlignment="Top" Width="100" Click="Delete_Click"/>
<Button x:Name="Back" Content="戻る" HorizontalAlignment="Left" Height="45" Margin="30,40,0,0" VerticalAlignment="Top" Width="100" Click="Back_Click"/>
</StackPanel>
</WrapPanel>
</Window>
/// <summary>
/// コンストラクタ
/// </summary>
public Terminals()
{
InitializeComponent();
SetData();
}
/// <summary>
/// データグリッドにデータをバインド
/// </summary>
private void SetData()
{
var ds = new DataSet();
try
{
conn = new SqlConnection(Define.CONN_STR);
conn.Open();
string qry = "SELECT * FROM Terminals WHERE IsDelete='False' ORDER BY TerminalDisplayOrder ASC;";
adapter = new SqlDataAdapter(qry, conn);
adapter.SelectCommand.CommandType = CommandType.Text;
adapter.Fill(ds);
}
catch (Exception ex)
{
// 省略
}
GridTerminals.ItemsSource = ds.Tables[0].DefaultView;
GridTerminals.Columns[0].Width = 150;
GridTerminals.Columns[1].Width = 210;
GridTerminals.Columns[0].Header = HEADER_TERMINAL_CD;
GridTerminals.Columns[1].Header = HEADER_TERMINAL_IP_ADDRESS;
}
/// <summary>
/// コンストラクタ
/// </summary>
public Terminals()
{
InitializeComponent();
//SetData();
ContentRendered += (s, e) => SetData();
}
화면이 렌더링되기 전에 DataGrid 열을 조작하려고 했기 때문입니다.
ContentRenderd의 이벤트에 문제의 메소드를 추가해, 렌더링 후에 실시하도록(듯이) 하면, 제대로 움직였다.
Reference
이 문제에 관하여(DataGrid를 조작하려고하면 인덱스 오류가 발생합니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/miltood/items/197c1eaa38ed159a1b06텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)