在获取行中的单元格值时获取错误对象引用未设置为对象实例

时间:2013-11-30 05:36:57

标签: c# winforms gridview devexpress

我试图获得聚焦行的单元格值和前一行单元格值。我用过这段代码

object eachprice = gridView1.GetRowCellValue(gridView1.FocusedRowHandle,gridView1.Columns["Price"]);

此代码获取焦点行中的价格值

object eachprice = gridView1.GetRowCellValue(gridView1.FocusedRowHandle-1, gridView1.Columns["Price"]);

但此代码未获取上一行的单元格值。它显示空值,所以我得到错误“对象引用未设置为对象的实例”

这是我的代码

private void discountcol()
    {

        if ((getdisc == tempstr) && (rownumber >= 1))
        {
            int focusedcount = gridView1.FocusedRowHandle;

            t1.Text = "";
            t1.Text = getdisc;

            object eachprice = gridView1.GetRowCellValue(focusedcount-1, gridView1.Columns["Price"]);
            t2.Text = eachprice.ToString();

            if (!(t2.Text == string.Empty))
            {
                decimal pricedecimal = Convert.ToDecimal(t2.Text);
                object eachdiscount = gridView1.GetRowCellValue(gridView1.FocusedRowHandle, gridView1.Columns["Price"]);
                decimal eachdisdecimal = Convert.ToDecimal(eachdiscount);
                decimal tempdiscountprice = -(pricedecimal * (eachdisdecimal / 100));  // -ve calculation
                t3.Text = tempdiscountprice.ToString("N2");

                gridView1.SetRowCellValue(gridView1.FocusedRowHandle, gridView1.Columns["Price"], t3.Text);

                if (getdisc == tempstr)
                {
                    PricQuan.UnboundType = DevExpress.Data.UnboundColumnType.Decimal;
                    PricQuan.UnboundExpression = " 1 * [Price]";

                    TaxinAmount.UnboundType = DevExpress.Data.UnboundColumnType.Decimal;
                    TaxinAmount.UnboundExpression = " ([Price] * ([TaxInPercentage] / 100.0)) * 1 ";
                }
                else
                {
                    //PricQuan.UnboundType = DevExpress.Data.UnboundColumnType.Decimal;
                    //PricQuan.UnboundExpression = " Round([Quantity] * [Price], 2)";

                    //TaxinAmount.UnboundType = DevExpress.Data.UnboundColumnType.Decimal;
                    //TaxinAmount.UnboundExpression = " ([Price] * ([TaxInPercentage] / 100.0)) * [Quantity] ";
                }

            }

        }
        else
        {

        }
    }

1 个答案:

答案 0 :(得分:1)

您应该使用focusedrowchangedevent来获取上一个rowhandle。 How to get gridview cell value in RepositoryItemGridLookupEdit_ValueChanged Event and set in TextEdit?

事实上,这一行正在运作:object eachprice = gridView1.GetRowCellValue(focusedcount, gridView1.Columns["Price"]);

但是为什么你不使用数据源的魔力;)我会给你一个小例子:

让我们说我们有一个产品,它有一个标题和价格。所以我们需要一个产品类。

public class Product
{
  public string Title{get;set;}
  public decimal Price{get;set;}
}

现在我们有一个应该在网格中显示的Productlist。所以我们创建一个IList并将其绑定到网格。

public partial class MyForm : XtraForm
{
  public MyForm()
  {
    InitializeComponent();
  }

  private List<Product> MyList()
  {
    List<Product> myList = new List<Product>();
    //Add all your Products
  }

  private void LoadGrid()
  {
     MyGrid.DataSource = MyList();
  }
}

现在,Gridview只显示列表中的数据。它唯一的功能是显示数据。所有工作都可以使用数据源(列表)处理的数据。 如果你想获得focusrow的值,它的工作原理如下:

private void MyGridView_FocusedRowChanged(object sender, DevExpress.XtraGrid.Views.Base.FocusedRowChangedEventArgs e)
{
   Product product = (Product)MyGridView.GetRow(e.FocusedRowHandle);
   //Now you have your complete Object again! You dont need to ask every value with        getrowcell value or sth.

   //For example
   MyTextEdit.Text = product.Price.toString();
}

它只是一个小而丑陋的例子来展示它是如何运作的。 在我看来,这是处理Grid工作的更美妙方式。它更容易处理。