我使用XAML创建了一个DataGrid,如下所示:
<DataGrid x:Name="GroupVw" Width="200" HorizontalAlignment="Center" HeadersVisibility="None" Height="196" />
我的代码看起来像这样:
public static string ConnStr { get; set; }
public MainWindow()
{
ConnStr = @"Server=(LocalDB)\MSSQLLocalDB;AttachDbFilename=F:\LakDb_YIX6R.mdf;Integrated security=True;Connection Timeout=30";
InitializeComponent();
GetGroups();
}
public void GetGroups()
{
try
{
DataTable gTbl = new DataTable();
using (SqlConnection c = new SqlConnection(ConnStr))
{
string query = "select * from Groups";
using (SqlDataAdapter da = new SqlDataAdapter(query, c))
{
c.Open();
da.Fill(gTbl);
c.Close();
}
}
GroupVw.ItemsSource = gTbl.DefaultView;
GroupVw.Columns[0].Visibility = Visibility.Hidden;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Lock & Key", MessageBoxButton.OK, MessageBoxImage.Warning);
}
}
}
当我运行程序时,我得到一条错误消息,说“索引超出范围”。DataGrid填充了2列。第一列是ID号,第二列是组名。我想对用户隐藏第一列,但允许程序访问它。
可能吗?我该怎么做?
我试着替换后面的代码行:
GroupVw.Columns[0].Visibility = Visibility.Hidden;
其中:
int n = GroupVw.Columns.Count;
MessageBox.Show("Column Count: " + n.ToString());
当我运行这个程序时,我得到一个消息框显示:“列数:0”
那么,当我在DataGrid中看到数据时,这是怎么可能的呢?我该如何修复它呢?
还有,我怎么能隐藏一列呢?
2条答案
按热度按时间t2a7ltrp1#
我想既然你的
DataGrid
列是自动生成的,你可以尝试订阅DataGrid.AutoGeneratingColumn
事件并在那里隐藏列。Xaml:事件处理程序:
mv1qrgav2#
问题是生成列需要一些时间。
既然你似乎只想要一个列,那么我会考虑在数据网格上设置autogeneratepoluments false,并显式定义你想要的一个列,我仍然会在你行的datacontext中。
你使用数据网格看起来很奇怪。也许这应该是一个列表框。
或者,您可以在窗口上处理contentrendered。这将在数据网格构建出它的列后触发。