[英]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.