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