繁体   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