2012-05-03 10 views
3

私は、ストアドプロシージャを通じてストアドプロシージャを移入されたGridViewを持っているWinフォームを持っているがどのようにdatagridview現在の行の列の値を取得するには?

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 

であり、私はこのコード

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; 

で動的にGridViewを移入しています私は選択したいですselectedRowのcustID、contractID、totalpayment私はそれを行うことができ、2番目の質問は私がstoredprocedureで使用した通貨記号についてですか、それは正しい方法ですか、それを行うための最善の方法は何ですか?値を取得する

答えて

3

説明したように、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; 
} 

他にも、SQLクエリではなくDataGridViewの書式設定を残すことをお勧めします。これは、データアクセス/ビジネスロジックレイヤーをプレゼンテーション/ 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が使用される理由の1つです(VS DataSet Designer、LINQ2SQLデザイナー、EntityFrameworkなど)。これにより、データベースクエリー/オブジェクトの設計時サポートが提供されます。デザイン時にこれらのデータクラスをUIコントロールに直接バインドし、コードを実行する前にプレゼンテーションレイヤーに関するすべての情報(たとえば、非表示にする列、追加の計算列、特殊な列の書式、条件付き行/列/セル画など)。

私の価値はわずか0.02ドルです。

+0

** dt.Load(dr)** ** dr **とは何ですか** – mepk

+0

申し訳ありませんデータレ心 – mepk

+0

私はあなたのコードを取り、その3行を追加しました。カラムを正しくエイリアスするようにしてください。さもなければ、それらを見つけることはUIレイヤーの推測に過ぎません。 – SPFiredrake

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); 
} 
0

あなたはselectイベントをオーバーライドします。あなたは

<asp:TemplateField HeaderText="Total Payment"> 
<itemTemplate> 
    <asp:label id="lblTotalPayment" Text='<%# Eval("TotalPayment","{0:C}") %>' runat="server" /> 
</itemTemplate> 
</asp:TemplateField> 

ただし、次の構文を使用して、ラベルまたは別のコントロールにあなたのドル金額を評価することができTemplateFieldを使用して

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); 
} 

あなたはまた、あなたのコード内の列を作成することができます...

そのルートに行くには、1つではなく、すべてのフィールドをセットアップする必要があります。

+0

これは、Web.UI GridViewではなく、WinForms DataGridView用です。しかし、この論理は、とにかくあなたが提案しているものとかなり似ています。 – SPFiredrake

関連する問題