2012-05-03 5 views
3

У меня есть WinForm, который имеет GridView, который заполняемая через хранимые процедуры хранимой процедуруКак получить значение столбца текущей строки строки 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 

и я наполнение 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, totalpayment selectedRow, я не знаю, как я могу это сделать, а второй вопрос о знаке валюты, который я использовал в хранимой процедуре, это правильный путь или что это лучший способ сделать это?

ответ

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

другая вещь, которую я хотел бы предложить вам сделать, это оставить форматирование к DataGridView вместо запроса SQL. Это, как правило, самая лучшая практика при разделении уровня доступа к данным/бизнес-логики с вашего уровня представления/пользовательского интерфейса. То, как вы это сделаете, будет указывать DataFormatString в DataColumn DataTable для соответствующих столбцов. В данном конкретном случае, вы могли бы сделать это:

... 
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, конструктор LINQ2SQL, EntityFramework и т. Д.), Так что у вас есть поддержка времени запросов базы данных/объектов. Это упрощает привязку этих классов данных непосредственно к элементам управления пользовательским интерфейсом во время разработки и определяет все, что касается уровня представления, до того, как даже запустить код (например, какие столбцы будут скрыты, любые дополнительные расчетные столбцы, специальное форматирование столбцов, условная строка/column/cell painting и т. д.).

Только мои $ 0,02.

+0

Что такое ** dr ** in ** dt.Load (dr) ** – mepk

+0

sorry datareader – mepk

+0

Я просто взял ваш код и добавил эти три строки к нему. Просто убедитесь, что вы правильно используете псевдонимы своих столбцов, иначе их обнаружение будет не чем иным, как догадкими на уровне пользовательского интерфейса. – 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

Чтобы получить значения, которые вы бы переопределить выберите событие.

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> 

Однако для этого маршрута вам нужно будет настроить все поля, а не только один.

+0

Это для WinForms DataGridView, а не для Web.UI GridView. Однако логика довольно похожа на то, что вы предлагаете в любом случае. – SPFiredrake

Смежные вопросы