DataGrid를 조작하려고하면 인덱스 오류가 발생합니다.

10925 단어 XamlDataGridC#WPF

사건



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의 이벤트에 문제의 메소드를 추가해, 렌더링 후에 실시하도록(듯이) 하면, 제대로 움직였다.

좋은 웹페이지 즐겨찾기