如何获取datagridview当前行列值?

时间:2012-05-03 17:42:28

标签: c# sql winforms datagridview

我有一个winform,它有一个gridview,通过存储过程填充存储过程

    ALTER PROCEDURE [dbo].[spGetAllCustumer]

    AS
    SET NOCOUNT ON 
SET XACT_ABORT ON  
    BEGIN TRAN
  BEGIN
SELECT     Customer.CustID, Customer.CustName, Customer.CompanyName, Customer.CompanyRealtion, Contract.ContractID, Contract.ContractDate, 
                  '$'+ CONVERT(varchar,Contract.totalPayment,1), '$'+ CONVERT(varchar,Contract.monthlyInstallment,1), '$'+ CONVERT(varchar,Contract.totalCommission,1), Contract.ContractDuration, Contract.PaymentMode, Contract.Description, 
                  Customer.Disable
FROM         Customer INNER JOIN
                  Contract ON Customer.CustID = Contract.CustID
WHERE     (Customer.Disable = 'false')

 END
commit

我正在使用此代码动态填充gridview

    con.ConnectionString = "Data Source=MRDEVELOPER;Initial Catalog=Crystal_Accounts;Integrated Security=True";
            SqlCommand com = new SqlCommand();
            com.Connection = con;
            com.CommandText = "spGetAllCustumer";
            com.CommandType = CommandType.StoredProcedure;
            com.Parameters.Clear();
            con.Open();
            SqlDataReader dr = com.ExecuteReader();
            DataTable dt = new DataTable();
            dt.Load(dr);
            dataGridView1.DataSource = dt;

我想选择custID,contractID,所选择的总付款我不知道我该怎么做,第二个问题是关于我在存储过程中使用的货币符号是正确的方式还是什么是最好的方法吗?

3 个答案:

答案 0 :(得分:3)

正如volody指出的那样,您可以使用SelectedRows属性来获取所需的一切。但是,您可能不知道相关列的索引(尽管它们通常以与查询相同的顺序生成,因此请确保正确地对列进行别名),您可以通过字符串访问使用列文本本身细胞:

foreach(DataGridViewRow row in DataGridView1.SelectedRows)
{
    // Do something with row.Cells["CustID"].Value;
    // Do something with row.Cells["ContractID"].Value;
    // Do something with row.Cells["TotalPayment"].Value;
}

我建议你做的另一件事是将格式保留到DataGridView而不是SQL查询。在将数据访问/业务逻辑层与演示文稿/ UI层分离时,这通常是最佳做法。这样做的方法是在DataTable的DataColumn上为相关列指定DataFormatString。在这种特殊情况下,您可以这样做:

...
DataTable dt = new DataTable();
dt.Load(dr);
dt.Columns["TotalPayment"].DataFormatString = "C";
dt.Columns["MonthlyInstallment"].DataFormatString = "C";
dt.Columns["TotalCommission"].DataFormatString = "C";
dataGridView1.DataSource = dt;

在代码中执行所有操作的缺点是您没有获得任何设计时支持,这意味着您必须在运行时测试所有内容(这可能非常耗时)。这是使用ORM的原因之一(例如VS DataSet Designer,LINQ2SQL设计器,EntityFramework等),因此您可以获得数据库查询/对象的设计时支持。它使得在设计时将这些数据类直接绑定到UI控件更容易,甚至在运行代码之前确定表示层的所有内容(例如哪些列将被隐藏,任何其他计算列,特殊列格式,条件行/列/单元格绘画等)。

价值0.02美元。

答案 1 :(得分:2)

使用SelectedRows集合

int columnOfcustID = 0; // change this to correct custID column index
int columnOfcontractID = 1; // change this to correct contractID column index
int columnOftotalpayment = 2; // change this to correct totalpayment column index
foreach(DataGridViewRow row in DataGridView1.SelectedRows)
{
    Console.WriteLine(row.Cells[columnOfcustID].Value);
    Console.WriteLine(row.Cells[columnOfcontractID].Value);
    Console.WriteLine(row.Cells[columnOftotalpayment].Value);
}

答案 2 :(得分:0)

要获取值,您将覆盖select事件。

void GridView1_SelectedIndexChanging(Object sender, GridViewSelectEventArgs e)
{

   GridViewRow row = GridView1.Rows[e.NewSelectedIndex];

   //get value from cells
   String var = row.Cells[1].Text; 

   //do something with the value or pass the values to a function here
   DoSomething(var);
}

您还可以在代码中创建列...

使用TemplateField,您可以使用以下语法

评估标签或其他控件的美元金额
<asp:TemplateField HeaderText="Total Payment">
<itemTemplate>
    <asp:label id="lblTotalPayment" Text='<%# Eval("TotalPayment","{0:C}") %>' runat="server" />
</itemTemplate>
</asp:TemplateField>

然而,要走那条路,你必须设置所有的字段,而不仅仅是一个。