3

ストアドプロシージャを介してデータを入力するグリッドビューを持つwinformがあります。ストアドプロシージャは次のとおりです。

    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;

custID、contractID、selectedRow の totalpayment を選択したいのですが、方法がわかりません。2 番目の質問は、storedprocedure で使用した通貨記号についてです。それは正しい方法ですか、それを行う最善の方法は何ですか? ?

4

3 に答える 3

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

私が提案するもう1つのことは、SQLクエリではなくDataGridViewにフォーマットを任せることです。これは、データアクセス/ビジネスロジックレイヤーをプレゼンテーション/UIレイヤーから分離する場合の一般的なベストプラクティスです。DataFormatStringこれを行う方法は、問題の列のDataTableのDataColumnでを指定することです。この特定のケースでは、これを行います。

...
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 Designer、EntityFrameworkなど)、データベースクエリ/オブジェクトの設計時サポートがあります。これにより、設計時にこれらのデータクラスをUIコントロールに直接バインドし、コードを実行する前にプレゼンテーション層に関するすべてを決定することがさらに簡単になります(非表示になる列、追加の計算列、特別な列の書式設定、条件付き行など) / column / cellpaintingなど)。

ちょうど私の0.02ドルの価値。

于 2012-05-03T18:35:32.983 に答える
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);
}
于 2012-05-03T18:11:25.010 に答える
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>

ただし、そのルートに進むには、1 つだけでなくすべてのフィールドを設定する必要があります。

于 2012-05-03T18:20:52.287 に答える