簡體   English   中英

單擊 DataGrid 的列名會生成 System.InvalidOperationException

[英]Clicking on the column name of the DataGrid generates System.InvalidOperationException

我在 WPF 應用程序中創建了以下 DataGrid 對象。

<Border
    BorderBrush="Black"
    BorderThickness="2"
    ScrollViewer.VerticalScrollBarVisibility="Visible"
    ScrollViewer.HorizontalScrollBarVisibility="Visible"
    Width="1110"
    Height="355"
    Margin="0,10,0,0"
    Grid.Column="1"
    Grid.Row="6"
    Grid.ColumnSpan="3"
    HorizontalAlignment="Center">
    <DataGrid
        Name="datagrid"
        ItemsSource="{Binding ElementName=datagrid, Mode=OneWay}"
        CanUserSortColumns="True"
        CanUserResizeRows="True"
        HorizontalAlignment="Left"
        VerticalAlignment="Stretch"
        VerticalScrollBarVisibility="Visible"
        HorizontalScrollBarVisibility="Visible"
        ScrollViewer.VerticalScrollBarVisibility="Visible"
        ScrollViewer.HorizontalScrollBarVisibility="Visible"
        IsReadOnly="True"
        Height="355"
        Width="1110"
        Grid.Column="1"
        Grid.Row="6"
        Grid.ColumnSpan="3">
    </DataGrid>
</Border>

如您所見,ItemSource 已綁定。 所以我用值填充數據網格的方法是調用一個返回表的 sql 查詢。 下面的代碼演示了這一點。

private void PullDataFiles(string connectionstring, string tablenamevalue, DataGrid mainwindowdatagrid, int orderboolean)
{
    string connString = connectionstring;

    if (orderboolean == 1)
    {
        string query = $"SELECT * FROM [dbo].[{tablenamevalue}] ORDER BY 1 DESC";

        using (SqlConnection conn = new SqlConnection(connString))
        {

            SqlCommand cmd = new SqlCommand(query, conn);
            conn.Open();

            SqlDataAdapter da = new SqlDataAdapter(cmd);
            DataTable dt = new DataTable();
            da.Fill(dt);
            mainwindowdatagrid.ItemsSource = dt.DefaultView;
       }
    }
}

所以我調用方法如下:

PullDataFiles(SQLServerConnectionDetails(), TextBlock1.Text, datagrid, 0); //where datagrid is the DataGrid from XAML code posted above

一切正常。 除非我(和應用程序的隨機用戶)會意外單擊 DataGrid 的列名。 如果用戶單擊列名稱的更遠一點,則整個列將成功排序。 但是,當用戶單擊列名稱頂部時,應用程序會因產生以下錯誤而崩潰:

System.InvalidOperationException:“'System.Windows.Documents.Run' 不是 Visual 或 Visual3D。”

我真的很感激你在這件事上的幫助。

一種可能的解決方案是防止用戶單擊標題。 意思是禁用標題選項卡的任何功能。 這可以通過更改標題的樣式來實現,如下所示:

<DataGrid>
...
    <DataGrid.Resources>
        <Style BasedOn="{StaticResource {x:Type DataGridColumnHeader}}" TargetType="{x:Type DataGridColumnHeader}">
            <Setter Property="IsHitTestVisible" Value="False"/>
            <Setter Property="Focusable" Value="False"/>
        </Style>
    </DataGrid.Resources>
</DataGrid

這將防止用戶單擊您的列並因此生成錯誤異常。

我猜這個異常是因為你多次調用數據網格而產生的,所以它會刷新。

我知道我的回答不能解決您最初的問題,但這是一個臨時解決方案。

我遇到了同樣的錯誤,在我的情況下,我從 DataGrid 列名稱中刪除了所有下划線,問題就解決了。

嘗試使用僅包含字母字符和空格的列名。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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