我使用了这个代码:Adding a CheckBox column to your DataGrid。
我在CheckBoxItem 类的BindData 中注释了一些行:
private void BindData(object sender, EventArgs e)
{
CheckBox box = (CheckBox)sender;
DataGridItem container = (DataGridItem)box.NamingContainer;
box.Checked = false;
}
然后在绑定数据源时,添加自定义复选框列:
// Perform the binding.
DataGrid_AuditSearch.DataSource = ds;
DataGrid_AuditSearch.DataBind();
// Create and add the custom checkbox column
CheckBoxColumn checkBoxColumn = new CheckBoxColumn(false);
checkBoxColumn.HeaderText = "Selected";
DataGrid_AuditSearch.Columns.Add(checkBoxColumn);
DataGrid_AuditSearch.DataBind();
它似乎可以解决问题。希望对你有帮助!
感谢Shaun Wilde,这是CheckBoxColumn 和CheckBoxItem 的完整课程。
CheckBoxColumn.cs
public class CheckBoxColumn :System.Web.UI.WebControls.TemplateColumn
{
/// <summary>
/// Initialise our CheckBoxColumn.
/// </summary>
public CheckBoxColumn()
{
// set the view one as readonly
viewItem = new CheckBoxItem(false); // SAW was false
this.ItemTemplate = viewItem as ITemplate;
// let the edit check box be editable
editItem = new CheckBoxItem(true);
this.EditItemTemplate = editItem as ITemplate;
}
/// <summary>
/// Initialise our CheckBoxColumn with an optional ImmediatePostback capability.
/// </summary>
/// <param name="ImmediatePostback">If true then each change of state of the CheckBox item
/// will cause an event to be fired immediately on the server.</param>
public CheckBoxColumn(bool ImmediatePostback)
{
// set the view one as readonly
viewItem = new CheckBoxItem(ImmediatePostback);
this.ItemTemplate = viewItem as ITemplate;
// let the edit check box be editable
editItem = new CheckBoxItem(true);
this.EditItemTemplate = editItem as ITemplate;
AutoPostBack = ImmediatePostback;
}
/// <summary>
/// Occurs when the value of the Checked property changes between posts to the server.
/// </summary>
/// <remarks>
/// The <b>CheckedChanged</b> event is raised when the value of the Checked property changes between posts to the server.
///
/// <b>Note</b> This event does not post the page back to the server unless the AutoPostBack property is set to true.
/// <b>Note</b> The control must have viewstate enabled for the <b>CheckedChanged</b> event to work correctly.
/// </remarks>
public event EventHandler CheckedChanged
{
add
{
viewItem.CheckedChanged += value;
editItem.CheckedChanged += value;
}
remove
{
viewItem.CheckedChanged -= value;
editItem.CheckedChanged -= value;
}
}
/// <summary>
/// If true then then each click on a CheckBox will cause an event to be fired on the server.
/// </summary>
public bool AutoPostBack
{
set
{
viewItem.AutoPostBack = value;
editItem.AutoPostBack = value;
}
get
{
return viewItem.AutoPostBack;
}
}
/// <summary>
/// The DataField that we wish our control to bind to.
/// </summary>
public string DataField
{
get
{
return viewItem.DataField;
}
set
{
viewItem.DataField = value;
editItem.DataField = value;
}
}
/// <summary>
/// Internal storage of the CheckBoxItem that is to be used for the view state.
/// </summary>
private CheckBoxItem viewItem;
/// <summary>
/// Internal storage of the CheckBoxItem that is to be used for the edit state.
/// </summary>
private CheckBoxItem editItem;
}
CheckBoxItem.cs
internal class CheckBoxItem : ITemplate
{
/// <summary>
/// The CheckBoxItem constructor
/// </summary>
/// <param name="editable">true if the item is to be in its editable state, false for the item to be disabled.</param>
public CheckBoxItem(bool editable)
{
readOnly = (editable==true)?false:true;
}
/// <summary>
/// Instantiates the CheckBox that we wish to represent in this column.
/// </summary>
/// <param name="container">The container into which the control or controls are added.</param>
void ITemplate.InstantiateIn(Control container)
{
CheckBox box = new CheckBox();
box.DataBinding += new EventHandler(this.BindData);
box.AutoPostBack = autoPostBack;
box.CheckedChanged += new EventHandler(this.OnCheckChanged);
container.Controls.Add(box);
}
/// <summary>
/// Our CheckChanged event
/// </summary>
public event EventHandler CheckedChanged;
/// <summary>
/// This is a common handler for all the Checkboxes.
/// </summary>
/// <param name="sender">The raiser of this event a CheckBox.</param>
/// <param name="e">A System.EventArgs that contains the event data.</param>
private void OnCheckChanged(object sender, EventArgs e)
{
if (CheckedChanged != null)
{
CheckedChanged(sender, e);
}
}
/// <summary>
/// The internal storage for which DataField we are going to represent.
/// </summary>
private string dataField;
/// <summary>
/// Used to set the DataField that we wish to represent with this CheckBox.
/// </summary>
public string DataField
{
get
{
return dataField;
}
set
{
dataField=value;
}
}
/// <summary>
/// The internal storage for the AutoPostback flag.
/// </summary>
private bool autoPostBack=false;
/// <summary>
/// Set the AutoPostBack flag. If this is true then each time a CheckBox is clicked
/// in the Column that contains this item then an event is raised on the server.
/// </summary>
public bool AutoPostBack
{
set
{
autoPostBack = value;
}
get
{
return autoPostBack;
}
}
/// <summary>
/// Handler for the DataBinding event where we bind the data for a specific row
/// to the CheckBox.
/// </summary>
/// <param name="sender">The raiser of the event.</param>
/// <param name="e">A System.EventArgs that contains the event data.</param>
private void BindData(object sender, EventArgs e)
{
CheckBox box = (CheckBox) sender;
DataGridItem container = (DataGridItem) box.NamingContainer;
box.Checked = false;
box.Enabled = (readOnly == true) ? false:true;
string data = ((DataRowView) container.DataItem)[dataField].ToString();
Type t = ((DataRowView)container.DataItem).DataView.Table.Columns[dataField].DataType;
if (data.Length>0)
{
switch (t.ToString())
{
case "System.Boolean":
if (( data == "True") || (data == "true"))
{
box.Checked = true;
}
break;
default:
break;
}
}
}
/// <summary>
/// Internal storage for the readOnly flag.
/// </summary>
private bool readOnly = true;
}