C#代码 怎么设置ListView中Checkbox 为选中状态

youqingyike 2014-08-13 02:20:00
界面是ListView 第一列插入CheckBox 控件,后面插入数据 跟list绑定,
下面有四个按钮,两个有效,点添加,ListView中加入一条数据,
点Test按钮 可以将ArrayList al 中二四两行的CheckBox 的IsCheck属性设置为true,界面方框打勾。
现在想在界面初始化后,呈现时将第二行和第四行 属性设置为true,界面方框打勾,怎么实现比较好

界面代码:
<Window x:Class="YunNan_Weather.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="云南气象" Height="600" Width="800" ResizeMode="NoResize" WindowStartupLocation="CenterScreen">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="100*" />
<RowDefinition Height="120" />
</Grid.RowDefinitions>

<ListView Name="lvScnMsg" ItemsSource="{Binding}" MouseDoubleClick="lvScnMsg_MouseDoubleClick">
<ListView.View>
<GridView x:Name="grdViewScn">
<GridViewColumn Width="80">
<GridViewColumn.Header >
<CheckBox >全选</CheckBox>
</GridViewColumn.Header>
<GridViewColumn.CellTemplate>
<DataTemplate x:Name="dtl">
<CheckBox x:Name="chekBox" Tag="{Binding Path = DevID}" Click="CheckBox_Click"></CheckBox>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Header="ID" Width="100" x:Name="grdViewColumnID" DisplayMemberBinding = "{Binding Path=DevID}"></GridViewColumn>
<GridViewColumn Header="分 组" Width="200" x:Name="grdViewColGroup" DisplayMemberBinding = "{Binding Path=DevGroup}"></GridViewColumn>
</GridView>
</ListView.View>
</ListView>
<Grid Grid.Row="1" Margin="0" Name="grid1">
<Grid.RowDefinitions>
<RowDefinition Height="52*" />

</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100*" />
<ColumnDefinition Width="100*" />
<ColumnDefinition Width="100*" />
<ColumnDefinition Width="100*" />
</Grid.ColumnDefinitions>
<Button Content="添 加" Height="27" Margin="60,15" Name="btnAdd" Click="btnAdd_Click" />
<Button Content="删 除" Height="27" Grid.Column="1" Margin="60,15" Name="btnDel" Click="btnDel_Click" />
<Button Content="编 辑" Height="27" Grid.Column="2" Margin="60,15" Name="btnEdit" Click="btnEdit_Click" />
<Button Content="Test" Height="27" Grid.Column="3" Margin="60,15,53,15" Name="btnSetGrp" Click="btnSetGrp_Click" />
</Grid>
</Grid>
</Window>

C# 逻辑代码:


using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
using System.Collections;

namespace YunNan_Weather
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
int m_iDevNum = 0;
List<int> m_selectDevID = new List<int>(); //保存多选设备ID
List<NewMsg> m_listDevice = new List<NewMsg>(); //设备列表源数据
NewMsg m_editNsm; //lvScnMsg中当前选中项


public MainWindow()
{
InitializeComponent();
this.lvScnMsg.ItemsSource = m_listDevice; //为ListView绑定数据源

for (int i = 0; i < 10; i++)
{
createNewMsg();
}

setCheckBox();
}

private void btnAdd_Click(object sender, RoutedEventArgs e)
{
createNewMsg();
lvScnMsg.Items.Refresh();//刷新数据
}


private void createNewMsg()
{
NewMsg devMsg = new NewMsg()
{
DevID = ++m_iDevNum, //预设值,界面不输入 就累加
};

m_listDevice.Add(devMsg);
}

/// <summary>
/// 由ChecBox的Click事件来记录被选中行的
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void CheckBox_Click(object sender, RoutedEventArgs e)
{
CheckBox cb = sender as CheckBox;
int iSelectId = Convert.ToInt32(cb.Tag.ToString()); //获取该行id
if (cb.IsChecked == true)
{
m_selectDevID.Add(iSelectId); //如果选中就保存id
}
else
{
m_selectDevID.Remove(iSelectId); //如果选中取消就删除里面的id
}
}

#region 删除

/// <summary>
/// 删除按钮
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnDel_Click(object sender, RoutedEventArgs e)
{
this.DeleteMembers(m_selectDevID);
this.lvScnMsg.Items.Refresh();//刷新数据
}

/// <summary>
/// 批量删除用户
/// </summary>
private void DeleteMembers(List<int> selectId)
{
if (selectId.Count > 0)
{
foreach (var id in selectId)
{
foreach (NewMsg ele in m_listDevice)
{
if (id == ele.DevID)
{
m_listDevice.Remove(ele);
break;
}
}


}
}
m_selectDevID.Clear();
m_iDevNum--;
}

#endregion


private void btnSetGrp_Click(object sender, RoutedEventArgs e)
{
setCheckBox();
}


private void setCheckBox()
{
ArrayList al = new ArrayList();
al.Add(2);
al.Add(4);

foreach (int iEle in al)
{
for (int i = 0; i < lvScnMsg.Items.Count; i++)
{
ListViewItem lvi = (ListViewItem)(this.lvScnMsg.ItemContainerGenerator.ContainerFromItem(this.lvScnMsg.Items[i]));

if (null!= lvi && iEle == m_listDevice[i].DevID)
{
CheckBox cb = FindVisualChild<CheckBox>(lvi);
cb.IsChecked = true;
}
}
}


}


private ChildType FindVisualChild<ChildType>(DependencyObject obj) where ChildType : DependencyObject
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(obj, i);
if (child != null && child is ChildType)
{
return child as ChildType;
}
else
{
ChildType childOfChildren = FindVisualChild<ChildType>(child);
if (childOfChildren != null)
{
return childOfChildren;
}
}
}
return null;

}
}

#region Device
/// <summary>
/// 新加设备
/// </summary>
public class NewMsg
{
int iDevID;
public int DevID
{
get { return iDevID; }
set { iDevID = value; }
}

ArrayList alDevGrp;
public ArrayList DevGroup
{
get { return alDevGrp; }
set { alDevGrp = value; }
}

}
#endregion


}
...全文
1148 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
youqingyike 2014-08-13
  • 打赏
  • 举报
回复
将 CheckBox 属性IsChecked 绑定 到类属性, 修改类属性就可以设置CheckBox的状态了,主要是以下代码: IsChecked="{Binding Path=CBIsChecked}" bool bCBIsChecked; public bool CBIsChecked { get { return bCBIsChecked; } set { bCBIsChecked = value; } }
youqingyike 2014-08-13
  • 打赏
  • 举报
回复
这个我试过了,在窗口出现后,点Test按钮,查找CheckBox设置IsChecked 为True没问题, 在窗口弹出时 除了在构造函数中 怎么能设置, 构造函数中 不能获取子控件的
youqingyike 2014-08-13
  • 打赏
  • 举报
回复
谢谢,我看下
exception92 2014-08-13
  • 打赏
  • 举报
回复
根据listView获取所有子CheckBox,循环设置IsChecked 参见: http://blog.csdn.net/duanzi_peng/article/details/17094639
youqingyike 2014-08-13
  • 打赏
  • 举报
回复
没人回复,就是怎么使ListView中 部分CheckBox打上勾,
zhouzangood 2014-08-13
  • 打赏
  • 举报
回复

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧