好吧基本上我是C#的新手,我目前正在为一家开发电子商务软件的公司工作,我遇到的问题似乎无法破解。
我有两列,我想添加第三列,显示复选框列表但我只想显示这些复选框,当其他两个(或一个)字段显示其中的某种形式的数据时,IE :
Name Type Check
lol lol
我还希望自动勾选这些复选框。
另一个问题是,我也希望在检查时将产品显示在我们的搜索中,但如果它们未被取消,我希望它们被隐藏但不会被删除。
我目前正在使用GridView,因为我不想重写已经存在的其余部分,因为它与SQL数据库进行通信,我对此一无所知。
我们没有使用ASP,我们正在使用XAML& C#(我对它们都知之甚少。)下面的图片描绘的是一幅糟糕的图画。
答案 0 :(得分:0)
您的问题非常广泛,有些难以回答。简而言之,您要查看的是控件上的Visibility
属性。
通过将Visibility
设置为Collapsed
,UI将不会显示该元素。如果需要,可以根据另一个XAML元素的值或数据删除来设置Visibility
,但是您需要实现一个实现IValueConverter的类来进行转换。
最常见的价值转换器之一是“布尔可见性”转换器。如果您在互联网上搜索,您将能够找到这些的示例。您可以复制该方法并创建“EmptyToVisibilityConverter”或“NullToVisibilityConverter”或您需要的任何其他内容。一旦有了转换器,就可以在绑定中指定它以获得可见性。例如:
<Page.Resources>
<conv:NullToVisibilityConverter x:Key="NullToVis"/>
</Page.Resources>
<CheckBox ... Checked={Binding ThisBoxIsChecked}
Visibility={Binding SomeOtherValue,
Converter={StaticResource NullToVis}}"/>
请记住,控件内容与可见性属性之间的数据绑定不必相同。您可以将内容绑定到一个值,并将可见性绑定到另一个值。
如果您不使用数据绑定,则必须在代码隐藏中设置它们。但是你为什么不使用数据绑定?
编辑:这是一个有效的例子。
如果这不是你想要的,那我就是迟钝而不理解这个问题
我建议你开始一个空白的项目,将其投入其中,然后稍微玩一下以了解如何进行设置。 XAML有一个相对陡峭的学习曲线,通常有几种方法可以完成你需要的东西,但你真的需要对数据绑定和INotifyPropertyChanged的基础理解(我在这个例子中没有涉及)。
这是C#代码:
using System;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Globalization;
using System.Windows;
using System.Windows.Data;
namespace CheckboxList
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
//Create a viewmodel and add some data to it.
var viewModel = new MyViewModel();
viewModel.Items.Add(new Data() {Name = "lol", Type = "lol", Selected = true});
viewModel.Items.Add(new Data() { Name = "lol", Type = "not_lol", Selected = true });
viewModel.Items.Add(new Data() { Name = "not_lol", Type = "not_lol", Selected = true });
//Set the window's datacontext to the ViewModel. This will make binding work.
this.DataContext = viewModel;
}
}
//This is the ViewModel used to bind your data
public class MyViewModel
{
//This could just be a List<Data> but ObservableCollection<T> will automatically
//update your UI when items are added or removed from the collection.
public ObservableCollection<Data> Items { get; set; }
public MyViewModel()
{
Items = new ObservableCollection<Data>();
}
}
//Just a sample class to hold the data for the grid.
//This is the class that is contained in the ObservableColleciton in the ViewModel
public class Data
{
public string Name { get; set; }
public string Type { get; set; }
public bool Selected { get; set; }
}
//This is an example converter. It looks to see if the element is set to "lol"
//If so, it returns Visibility.Collapsed. Otherwise, it returns Visibility.Visible.
public class LolToVisibilityConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value != null && value is string)
{
var input = (string) value;
if (string.Equals(input, "lol", StringComparison.CurrentCultureIgnoreCase))
{
return Visibility.Collapsed;
}
else
{
return Visibility.Visible;
}
}
return Visibility.Visible;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
}
和XAML:
<Window x:Class="CheckboxList.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:CheckboxList="clr-namespace:CheckboxList"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<!-- Create an instance of LolToVisibilityConverter and call it "LolToVis" -->
<CheckboxList:LolToVisibilityConverter x:Key="LolToVis"/>
</Window.Resources>
<Grid>
<ListView ItemsSource="{Binding Items}"> <!--Bind the contents of the Items collection in our viewmodel -->
<ListView.View>
<GridView>
<GridViewColumn Width="140" Header="Name" DisplayMemberBinding="{Binding Name}"/> <!-- bind this element to this column-->
<GridViewColumn Width="140" Header="Type" DisplayMemberBinding="{Binding Type}"/> <!-- bind this element to this column-->
<GridViewColumn Width="140" Header="Selected" > <!-- because we don't want this to just display true/false, we need to set up a template-->
<GridViewColumn.CellTemplate>
<DataTemplate>
<!-- we set the Visibility property to Name, and the converter to LolToVis-->
<!-- whenever this field will be displayed, it calls the converter to convert the string to a Visibility value-->
<!-- The visibility value is checked to determine whether or not the element should be displayed-->
<CheckBox IsChecked="{Binding Selected}" Visibility="{Binding Name, Converter={StaticResource LolToVis}}"/>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
</ListView.View>
</ListView>
</Grid>
</Window>
答案 1 :(得分:0)
这是我过去用来为每个datagridview行创建一个复选框...然后我使用datagridview_cellcontentclick事件处理程序在单击时更改复选框的值。在下面的代码的上下文中,我有一个自定义类,包括程序名称,窗口标题和打开的文件或URL。然后我创建了一个全局列表“oplist”,它是自定义custructor类型。然后,当我将列表中的项添加到datagridview时,我指定了列标题。然后在datagridview中添加或删除任何内容变得非常容易。您所要做的就是删除或添加项目到列表,然后刷新datagridview。
public void addOpenProgramsToDataGrid()
{
dataGridView1.ColumnCount = 3;
DataGridViewCheckBoxColumn column = new DataGridViewCheckBoxColumn();
{
column.HeaderText = "Selected";
column.Name = "Selected";
column.AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
column.FlatStyle = FlatStyle.Standard;
column.ThreeState = false;
column.CellTemplate = new DataGridViewCheckBoxCell();
column.CellTemplate.Style.BackColor = Color.White;
}
dataGridView1.Columns.Insert(0, column); // This is to be a checkbox column
dataGridView1.Columns[0].HeaderText = "X";
dataGridView1.Columns[1].HeaderText = "Process Name:";
dataGridView1.Columns[2].HeaderText = "Window Title";
dataGridView1.Columns[3].HeaderText = "Open File or URL";
dataGridView1.RowCount = opList.Count;
//opList.RemoveRange(0, opList.Count);
for (int a = 0; a < opList.Count; a++)
{
openProgram tempProgram = new openProgram();
tempProgram = opList[a];
dataGridView1.Rows[a].Cells[0].Value = true;
dataGridView1.Rows[a].Cells[1].Value = tempProgram.processName;
dataGridView1.Rows[a].Cells[2].Value = tempProgram.windowTitle;
dataGridView1.Rows[a].Cells[3].Value = tempProgram.openFileOrURL;
}
selectAllCheckBox.Checked = true;
}