1

我的复选框(在gridview内)有这个问题,我一直在网上搜索并破解我的大脑来解决这个问题..

我现在拥有的是,

(这是我的网格视图)

id   amount($)   
1    5         checkbox 
2    13        checkbox
3    25        checkbox

我有一个初始值(例如 $1000)。每当我选中gridview中的复选框时,它都会从初始值中减去。如果我检查 id=1,则会扣除初始值并显示 995 美元。

如果我继续检查另一个复选框,假设 id=3(所以现在我有 2 个复选框被选中),金额现在将显示为 970 美元。

目前,检查的第一个复选框效果很好,但是随后的复选框给我带来了问题..不是扣除 25 美元,而是扣除了 30 美元(25+5)

这是我的代码:

  protected void CheckBox1_CheckedChanged(object sender, EventArgs e)
    {
    foreach (GridViewRow row in GridView2.Rows)
    {
        CheckBox selectChk = (CheckBox)row.FindControl("CheckBox1");

        if (selectChk != null && selectChk.Checked)
        {
            String amount = ((Label)row.FindControl("amt")).Text;

            double amtSpend = Convert.ToDouble(usedSpace);

            double left = 100 - amtSpend;
            totalLbl.Text = left.ToString();


        }

我在想,因为它在一个 for 循环中,这就是为什么每次选中第二个复选框时,它都会再次运行整个 for 循环,并且它将包括第一个复选框的数量。反正我能解决这个问题吗?(同样对于第三个复选框,它将在第一个和第二个复选框中包含 amt)

或者有什么方法可以让我在不使用for循环的情况下选中复选框来获取gridview的特定行?

4

2 回答 2

0

为什么不使用实现 INotifyPropertyChanged 的​​类的数据源,这样您就不必遍历所有行和状态。当复选框更改状态时,setter 'Checked' 会被触发,因此您可以减去该 setter 内的数量。

using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.Windows.Forms;
using WindowsFormsApplication9.Annotations;

namespace WindowsFormsApplication9
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            BindingList<Entity> entities = new BindingList<Entity>();
            entities.Add(new Entity {Amount = 10.0, Checked = false, Id = 1});
            entities.Add(new Entity {Amount = 900.0, Checked = false, Id = 2});
            entities.Add(new Entity {Amount = 850.0, Checked = false, Id = 3});

            this.dataGridView1.DataSource = entities;
        }
    }

    public class Entity : INotifyPropertyChanged
    {
        private bool _bChecked;
        private double _dAmount;
        private int _iId;

        public int Id
        {
            get { return this._iId; }
            set
            {
                if (value == this._iId)
                    return;

                this._iId = value;
                this.OnPropertyChanged();
            }
        }

        public double Amount
        {
            get { return this._dAmount; }
            set
            {
                if (value == this._dAmount)
                    return;

                this._dAmount = value;
                this.OnPropertyChanged();
            }
        }

        public bool Checked
        {
            get { return this._bChecked; }
            set
            {
                if (value == this._bChecked)
                    return;

                this._bChecked = value;
                this.OnPropertyChanged();
                // Change the value 10 to the value you want to subtract
                if (value) this.Amount = this._dAmount - 10;
            }
        }

        #region INotifyPropertyChanged Members

        public event PropertyChangedEventHandler PropertyChanged;

        #endregion

        [NotifyPropertyChangedInvocator]
        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}



[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
  public sealed class NotifyPropertyChangedInvocatorAttribute : Attribute
  {
    public NotifyPropertyChangedInvocatorAttribute() { }
    public NotifyPropertyChangedInvocatorAttribute(string parameterName)
    {
      ParameterName = parameterName;
    }

    public string ParameterName { get; private set; }
  }
于 2013-08-03T18:45:03.427 回答
0

尝试这个,

foreach (GridViewRow row in GridView1.Rows)
{
     CheckBox chk = row.Cells[0].Controls[0] as CheckBox;
     if (chk != null && chk.Checked)
     {
           // ...
     }
}
于 2013-08-03T18:37:53.493 回答