如何隐藏WPF数据网格列?

mbyulnm0  于 2023-04-07  发布在  其他
关注(0)|答案(2)|浏览(203)

我使用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中看到数据时,这是怎么可能的呢?我该如何修复它呢?
还有,我怎么能隐藏一列呢?

t2a7ltrp

t2a7ltrp1#

我想既然你的DataGrid列是自动生成的,你可以尝试订阅DataGrid.AutoGeneratingColumn事件并在那里隐藏列。Xaml:

<DataGrid x:Name="GroupVw" Width="200" HorizontalAlignment="Center" HeadersVisibility="None" Height="196" AutoGeneratingColumn="GroupVw_AutoGeneratingColumn" />

事件处理程序:

private void GroupVw_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
    if (e.Column.Header.ToString() == "Id")
    {
        e.Column.Visibility = Visibility.Hidden;
    }
}
mv1qrgav

mv1qrgav2#

问题是生成列需要一些时间。
既然你似乎只想要一个列,那么我会考虑在数据网格上设置autogeneratepoluments false,并显式定义你想要的一个列,我仍然会在你行的datacontext中。
你使用数据网格看起来很奇怪。也许这应该是一个列表框。
或者,您可以在窗口上处理contentrendered。这将在数据网格构建出它的列后触发。

GroupVw.Columns[0].Visibility = Visibility.Hidden;

相关问题