silverlight中创建checkboxList
最近使用silverlight做了一个小程序,之所以使用silverlight是因为之前没有接触过这玩意,再加上项目组对我使用什么技术没有要求,
所以我选择了使用新的技术:Silverlight.一切从头开始啊。
在上一篇文章中我写了silverlight+webservice对数据库的访问,今天我要写的是如何在Silverlight中创建并使用CheckBoxList呢?
如何使用创建的这个CheckBoxList控件和数据库进行交互呢?OK,带着这些问题,我们开始快乐的旅行:
专题示例说明:我的数据库中有一个表:模块表。表中对应的字段:ID(主键),ModelName(模块名称)。
图片一对应的是职场中对应的角色名称、角色对应的权限、该角色是否拥有最高的操作权限以及最基本的操作:
当我点击"修改按钮"时,我希望在弹出来的子窗体中显示该SelectedItem的信息,如图二所示:
图一
当我选中"编号"是"4"的记录时,弹出相应的子窗口,并把对应的权限在CheckBoxList中勾选出来,OK,项目描述完毕。
图二
接下来就要看具体怎么实现了,精彩还在后面啊。
项目实现:
首先写一个实体类:
public class gb_modelModel
{
private string id;
public virtual string ID
{
get { return id; }
set { id = value; }
}
private string modelName;
public virtual string ModelName
{
get { return modelName; }
set { modelName = value; }
}
private string desModel;
public virtual string DesModel
{
get { return desModel; }
set { desModel = value; }
}
/// <summary>
/// 用于子页面的选中
/// </summary>
private bool isSelected;
public virtual bool IsSelected
{
get { return isSelected; }
set { isSelected = value; }
}
}
父页面"修改"按钮事件:
GH_Roles_Child roleChild;
/// <summary>
/// 更新角色
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_upt_Click(object sender, RoutedEventArgs e)
{
gh_RoleModel roleModel = (gh_RoleModel)dataGrid1.SelectedItem;
roleChild = new GH_Roles_Child(roleModel.RoleID,roleModel.RoleName,roleModel.RoleQX,roleModel.SuperID);
roleChild.Title = "角色信息";
roleChild.Show();
roleChild.Closed += new EventHandler(roleChild_Closed);
}
void roleChild_Closed(object sender, EventArgs e)
{
if (roleChild.DialogResult == true)
{
IEnumerable<gb_modelModel> list = (IEnumerable<gb_modelModel>)roleChild.checkBoxList1.ItemsSource;
IEnumerable<gb_modelModel> selectedList = list.Where(a => a.IsSelected == true);
//"update SYS_ROLE set QXM='"+va[0]+"',ZGQX="+va[1]+" where ID="+va[2]+"";
gh_RoleModel gh_Role = new gh_RoleModel();
//获取权限码
foreach (var p in selectedList)
{
if (p.IsSelected == true)
{
gh_Role.RoleQX += p.ID+",";
}
}
gh_Role.RoleID = roleChild.OKButton.Tag.ToString(); //主键
gh_Role.SuperID = roleChild.radioButton1.IsChecked == true ? "1" : "0"; //最高权限
string roleInfo = gh_Role.RoleID + "|" + gh_Role.RoleQX + "|" + gh_Role.SuperID;
client.uptRoleCompleted += new EventHandler<GH_ServiceReference.uptRoleCompletedEventArgs>(client_uptRoleCompleted);
client.uptRoleAsync(roleInfo);
}
}
void client_uptRoleCompleted(object sender, GH_ServiceReference.uptRoleCompletedEventArgs e)
{
if (e.Error == null)
{
MessageBox.Show("修改成功");
client.GetRolesCompleted += new EventHandler<GH_ServiceReference.GetRolesCompletedEventArgs>(client_GetRolesCompleted);
client.GetRolesAsync();
}
}
子窗口:
xaml:
<TextBlock Height="23" HorizontalAlignment="Left" Margin="65,61,0,0" Name="textBlock2" Text="角色模块" VerticalAlignment="Top" />
<ListBox Height="111" HorizontalAlignment="Left" Margin="131,61,0,0" x:Name="checkBoxList1" VerticalAlignment="Top" Width="204" >
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<controlsToolkit:WrapPanel Orientation="Vertical" Height="100" />
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.ItemTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding IsSelected,Mode=TwoWay}" x:Name="chk" Height="16" ><!--IsSelected用于标记是否选中-->
<TextBlock Text="{Binding ModelName}" FontSize="13" />
</CheckBox>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
xaml.cs:
//创建webservice的服务实例名client
GH_ServiceReference.GH_serviceSoapClient client = new GH.GH_ServiceReference.GH_serviceSoapClient();
public GH_Roles_Child()
{
InitializeComponent();
}
string moName = ""; //变量用于记忆父页面传递过来的值modelName,以便进行设置是否选中
public GH_Roles_Child(string id,string roleName,string modelName,string superRole) //重载构造函数
{
InitializeComponent();
OKButton.Tag = id;
textBox1.Text = roleName;
client.getModelsCompleted += new EventHandler<GH_ServiceReference.getModelsCompletedEventArgs>(client_getModelsCompleted); //获取所有模块信息
client.getModelsAsync();
moName = modelName;
}
/// <summary>
/// 返回控件是否被选中
/// </summary>
/// <param name="s"></param>
/// <returns></returns>
private bool getModelChecked(string s)
{
string[] mName = moName.Split(',');
for (int i = 0; i < mName.Length;i++ )
{
if (s.Equals(mName[i])) //如果该checkBoxList1列表中有和父页面传递过来的值相同的模块项
{
return true; //选中
}
}
return false;
}
/// <summary>
/// 获取所有的模块信息,并选中父页面显示的模块
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void client_getModelsCompleted(object sender, GH_ServiceReference.getModelsCompletedEventArgs e)
{
if (e.Error == null)
{
XmlReader reader = XmlReader.Create(new StringReader(e.Result.ToString()));
XDocument doc = XDocument.Load(reader);
var model = from item in doc.Descendants("models")
select new gb_modelModel()
{
ID = (string)item.Element("modelID"),
ModelName = (string)item.Element("modelName"),
IsSelected = (bool)getModelChecked((string)item.Element("modelName")) //判断是否选中,并赋值给IsSelected
};
checkBoxList1.ItemsSource = model.ToList();
//checkBoxList1.DisplayMemberPath = "ModelName"; //不能同时在代码中设置DisplayMemberPath属性又在前台页面设计使用ItemTemplate属性
checkBoxList1.UpdateLayout();
}
}