Не зная width
/ height
элемента position1, все равно можно выровнять его следующим образом:
.child {
position: absolute;
top: 50%; /* position the top edge of the element at the middle of the parent */
left: 50%; /* position the left edge of the element at the middle of the parent */
transform: translate(-50%, -50%); /* This is a shorthand of
translateX(-50%) and translateY(-50%) */
}
Стоит отметить, что CSS Transform поддерживается в IE9 и выше . (Префикс поставщика опущен для краткости)
Добавление top
/ left
в 50%
перемещает край верхнего / левого края элемента в середину родительского элемента, а функция translate()
с (отрицательным) значением из -50%
перемещает элемент на половину его размера. Следовательно, элемент будет располагаться посередине.
Это связано с тем, что процентное значение в свойствах top
/ left
относительно высота / ширина родительского элемента (который создает содержащий блок).
Хотя процентное значение в функции translate()
transform относительно ширина / высота самого элемента (Фактически это относится к размеру ограничивающей рамки ) .
Для однонаправленного выравнивания перейдите к translateX(-50%)
или translateY(-50%)
.
1. Элемент с position
, отличный от static
. То есть relative
, absolute
, fixed
.
Просто создайте экземпляр HttpClient следующим образом:
HttpClientHandler handler = new HttpClientHandler()
{
AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate
};
using (var client = new HttpClient(handler))
{
// your code
}
Хорошо, поэтому я в конечном итоге решил свою проблему. Если есть лучшие способы, дайте мне знать: -)
public DataSet getData(string strFoo)
{
string url = "foo";
HttpClient client = new HttpClient();
HttpResponseMessage response;
DataSet dsTable = new DataSet();
try
{
//Gets the headers that should be sent with each request
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
//Returned JSON
response = client.GetAsync(url).Result;
//converts JSON to string
string responseJSONContent = response.Content.ReadAsStringAsync().Result;
//deserializes string to list
var jsonList = DeSerializeJsonString(responseJSONContent);
//converts list to dataset. Bad name I know.
dsTable = Foo_ConnectAPI.ExtentsionHelpers.ToDataSet<RootObject>(jsonList);
//Returns the dataset
return dsTable;
}
catch (Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.Message);
return null;
}
}
//deserializes the string to a list. Utilizes JSON.net. RootObject is a class that contains the get and set for the JSON elements
public List<RootObject> DeSerializeJsonString(string jsonString)
{
//Initialized the List
List<RootObject> list = new List<RootObject>();
//json.net deserializes string
list = (List<RootObject>)JsonConvert.DeserializeObject<List<RootObject>>(jsonString);
return list;
}
RootObject содержит набор get, который получит значения JSON.
public class RootObject
{
//These string will be set to the elements within the JSON. Each one is directly mapped to the JSON elements.
//This only takes into account a JSON that doesn't contain nested arrays
public string EntityID { get; set; }
public string Address1 { get; set; }
public string Address2 { get; set; }
public string Address3 { get; set; }
}
Самый простой способ для создания вышеуказанных классов используется json2charp , который будет соответствующим образом отформатировать его, а также предоставить правильные типы данных.
Ниже приведен другой ответ в Stackoverflow снова он не учитывает вложенные JSON.
internal static class ExtentsionHelpers
{
public static DataSet ToDataSet<T>(this List<RootObject> list)
{
try
{
Type elementType = typeof(RootObject);
DataSet ds = new DataSet();
DataTable t = new DataTable();
ds.Tables.Add(t);
try
{
//add a column to table for each public property on T
foreach (var propInfo in elementType.GetProperties())
{
try
{
Type ColType = Nullable.GetUnderlyingType(propInfo.PropertyType) ?? propInfo.PropertyType;
t.Columns.Add(propInfo.Name, ColType);
}
catch (Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.Message);
}
}
}
catch (Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.Message);
}
try
{
//go through each property on T and add each value to the table
foreach (RootObject item in list)
{
DataRow row = t.NewRow();
foreach (var propInfo in elementType.GetProperties())
{
row[propInfo.Name] = propInfo.GetValue(item, null) ?? DBNull.Value;
}
t.Rows.Add(row);
}
}
catch (Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.Message);
}
insert.insertCategories(t);
return ds.
}
catch (Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.Message);
return null;
}
}
};
Затем, наконец, чтобы вставить вышеуказанный набор данных в таблицу со столбцами, которые были сопоставлены с JSON, я использовал объемную копию SQL и следующий класс
public class insert
{
public static string insertCategories(DataTable table)
{
SqlConnection objConnection = new SqlConnection();
//As specified in the App.config/web.config file
objConnection.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["foo"].ToString();
try
{
objConnection.Open();
var bulkCopy = new SqlBulkCopy(objConnection.ConnectionString);
bulkCopy.DestinationTableName = "dbo.foo";
bulkCopy.BulkCopyTimeout = 600;
bulkCopy.WriteToServer(table);
return "";
}
catch (Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.Message);
return "";
}
finally
{
objConnection.Close();
}
}
};
Таким образом, вышеизложенное позволяет вставить JSON из webAPI в базу данных. Это то, что я получаю, чтобы работать. Но отнюдь не ожидаю, что это будет идеально. Если у вас есть какие-либо улучшения, пожалуйста, обновите их соответствующим образом.
HttpClient
и ваш HttpResponse
внутри оператора using()
каждый, чтобы обеспечить правильное, своевременное удаление и закрытие базовых потоков.
– Ian Mercer
30 October 2014 в 01:10